Pretty much working commit, check the diff for full details.

* Simplified a bit of logic in pull/push.
* TODO: Make _copy, pull, and push take kwargs instead