implement push support

Implement push support via Remote.push which is called with a single
refspec and raises GitError (with an appropriate message where
possible) if the push fails.

Note that local push to non-bare repository is currently not
supported by libgit2.

-----

Been a while since I wrote any C so I look forward to having my patch critiqued :)  Feedback on API also welcomed.