Revamp `Bitv` and `BitvSet`

The types `Bitv` and `BitvSet` are badly out of date. This PR:
- cleans up the code (primarily, simplifies `Bitv` and implements `BitvSet` in terms of `Bitv`)
- implements several new traits for `Bitv`
- adds new functionality to `Bitv` and `BitvSet`
- replaces internal iterators with external ones
- updates documentation
- minor bug fixes

This is a significantly souped-up version of PR #15139 and is the result of the discussion there.

It could. It originally was, but was paired with `enumerate` 100% of the time. Pulling `enumerate` out would force us to use `skip` in the cases that a nonzero offset is needed, and this is potentially a bad perf hit since `skip`ping is O(n) while just storing the offset is O(1).

Also note that this iterator is an abstraction leak, so it will remain private to the module.