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. 
I just noticed that for the Sig provider and KeyPair provider, they are only choosing between BC and NSS. And NSS is faster for both. So we can just do a simple if statement to check if NSS is available that would really speed things up.
We could also consider only benchmarking SHA-256 for digests, as we barely use the others. 
After doing this and following bertm's suggestion to drop the warmup period and just run each 10k times, It only takes around 1min and about 20-30 sec to run. (I just watched my clock) This seems like an ok amount of time to delay startup to me. Is this still too much?