[WIP] Reduce the surface of the primitive hash interface.

This separates the interfaces into `HashAlgorithm` and `HashContext`.  There is one provider of `HashContext` that you instantiate directly with a given algorithm.

The context can be updated, copied, and finalized.

This drops direct `hashlib` compatibility in favor of reducing the API surface and providing one way to manipulate the underlying data.
 
Eventually the end result should be a separate module which provides complete `hashlib` compatibility written in terms of these interfaces.

* [x] New interfaces
* [x] Refactor tests
* [x] Refactor hashes module
* [ ] Update documentation