magit-push-dwim: extract from magit-push

Remove the default push implementation from the `magit-push' command,
leaving nothing but calling `magit-push-hook' behind.  Create a new
function `magit-push-dwim' from the removed code and add it to the
default value of the hook.  This allows using a simpler implementation
that is more true to Git, while not disturbing users who have grown
accustomed the, somewhat wacky, old implementation.
magit-push-dwim: port implementation from magit-push-remote

Port the `magit-push' implementation from the `magit-push-remote'
extensions to be used as `magit-push-dwim'.  Remove everything related
to the "push remote", obviously.  This implementation works the same as
the old, it's just cleaner.  It does *not* make `magit-push-dwim' more
faithful to what Git intended.