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. 
Please specify the exact semantics of this function. What parts of the `ByteBuffer` are read? What are the side-effects on the buffer? You might want to find inspiration in the `MessageDigest` Javadoc, make sure the programmer using *this* class does not have to read that documentation.