Alternative 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. 

- [x] define a Rugged::Backed interface
- [x] add support for `backend` option to `Repository#bare`
- [x] add support for `backend` option to `Repository#init_at` validating that `:bare` was passed