Precompute metadata and stop subclassing hash

This is my WIP implementation of our current plan from #1231.  Still to do:

- [x] Deprecate `:describes` key, either here or in 2.99
- [x] Deprecate `:example_group_block` key, either here or in 2.99
- [x] Benchmark the perf of this vs the old lazily computed way
- [x] Add docs (or label as `@private`) for new classes/modules and methods.
- [x] There are some further metadata improvements I have in mind but I may do it in another PR
- [x] Add deprecation warning to 2.99 for `Example#options`

For whoever reviews this: I spent a lot of work trying to put these commits into a logical ordering where each is self-contained, so it may be easier to review commit by commit (see 124e47c for example -- the commit message contains a good bit of info).