Use a hash context object with all hash operations

Some hash algorithms will require some persistent storage between
hashes. The current hash functions only accept the data that should be
hashed.

Create the opaque data type ColumbiaHashContext which is implemented by
each hash implementation and add it to the hash function prototypes.
This means however that the context has to be created even if the
particular hash algorithm that is in use doesn't need it.

Signed-off-by: Marcus Karlsson <mk@acc.umu.se>