Add HashAlgorithm, MessageDigestHashAlgorithm

HashAlgorithm is an interface for hash algorithms.
MessageDigestHashAlgorithm is a wrapper for MessageDigest so that
these algorithms can be used as a HashAlgorithm.
Add ByteArrayStorage

ByteArrayStorage keeps a collection of byte[], identified
by their hash. Only one copy will be stored for each byte[], however
it is assumed that no hash collision occur.
Made HashAlgorithm, ByteArrayStorage generic

HashAlgorithm can now take arbitrary classes instead of just byte[].
No implementations have been defined yet besides
MessageDigestHashAlgorithm which only takes byte[], however most of
the time just creating a wrapper that converts the objects into
byte[] and then passes that into a HashAlgorithm<byte[]> should work.
ByteArrayStorage has been renamed to HashStorage and can now store
arbitrary objects as long as a matching HashAlgorithm is provided.