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. 
`HashResult.compareTo(…)` only compares `HashResult.type`, not `HashResult.result` (yes, **that** is wrong, but has not been fixed AFAIK). Also, please compare hashes in a way that is insensitive to timing attacks, `Comparable.compareTo(…)` does not guarantee any such property.