Reorganize Branch.push into some template methods: public push, _push_with_bound_branches, and _basic_push. This fixes the case where the destination of push is bound, but the source branch format doesn't support binding.
Run push and pull hook tests with a local branch that does support binding, rather than skipping if the branch can't be bound to another of the same format.
(broken) because the hooks are given the wrong parameters when pushing into something bound to a remote branch.