Object/Reference: Add some nice template magic
Lots of refactoring...

Still trying to make the code cleaner, thus:

- Remove some redundancies.
  While doing that, teach trees to be checked out for themselves.
- Add overloads for some functions that don't actually use Result and
  deprecate the old ones.
- Add an o() method to ObjectPrivate-derivates, so we can avoid the
  C-Style or reinterpret_casting of git_object / git_tree / git_commit.
- try to fix several of our const-ness errors. There a so many of
  them...
Remove Object from class name of Blob, Commit, Tag and Tree
A bigger refactoring

- Provide ObjectXXX.hpp for compat
- Provide private classes for Tree, Blob, Tag and Commit
- Move some checking stuff over to Private classes
- Yet more constness-correctness
- Remove Result from functions that don't use it
- Provide deprecated wrappers