Allow downstream user to provide hash function implementations

Currently, the crate relies on sha1collisiondetection and sha2 to compute fingerprints. It'd be nice if instead the user could provide the hash functions, so that we don't have to depend on sha2 if in fact the downstream consumer has supplied SHA2 from say Nettle.

This would reduce the TCB.