SHA Cleanup

Massive overhaul of the SHA implementation. It now properly blocks to allow for multiple updates in a single message digest, whereas before that was not the case. This bypasses a lot of limitations of the prior code, as well as keeping the bit-level granularity, which is a feature a lot of SHA implementations don't have.

The signature that takes a pointer and a bit count is such a common way to call a message digesting algorithm that I have decided to punt on refactoring it into having a sentinel version.

I also added a thorough suite of tests to verify that the implementation works as expected.