Setting repo._shellvars works but is not a clean way to pass the pushvars
information from the push command to the exchange operation. Therefore
change it to actually pass pushvars as a push operation argument instead.
This makes third party extension like remotenames easier to support pushvars
cleanly. The key value parsing and verification code has been moved to a
lower level so it's harder to be bypassed and easier to be used in
remotenames which could replace push command entirely.