Hashing API

Here is the Hashing API I have written as part of my GSoC project. PreferredAlgorithms includes all my benchmarks except for Signatures as that requires my SigType enum. Benchmarks are based off of what I found that was already in the codebase. 
What if we already used `addBytes(…)` before? You may want to reset first. Also, this method has undocumented side-effects (most of your function have those, please document them all).