[WIP] Alternate backends support

Adds alternate backends support for object and reference storage. Backends are written in C and wrapped in a ruby container object to supply them to rugged, which extracts them and uses them for constructing/opening a repository through libgit2. 

- [ ] define a Rugged::Backed interface (two getters for the backend structs)
- [ ] add backwards compatible support for `backend` option to `Repository#bare`
- [ ] add backwards compatible support for `backend` option to `Repository#init_at` validating that `:bare` was passed