Implement git-describe

Based on #1066  and still mostly @nulltoken 's work, this breaks up the function into a gathering and formatting phase.

- [x] ￼git_describe_objects()
- [x] ￼git_describe_objects() tests
- [x] ￼git_describe_workdir()
￼- [x] git_describe_workdir() tests
  - [ ] Make sure we consider the repository dirty in the right situations
￼- [ ]  API documentation
￼- [ ] Either remove abbreviated_size from git_describe_format_options or implement it
- [ ] Rename `git_describe_opts` to `git_describe_options` and provide initializer functions for both new types.