Implement git-describe

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