Add ResourceCatalog implementation

A ResourceCatalog is used to manage Resource entries, which correspond to data stored in a ResourceStorage. Each time a Resource is Put(), md5 and sha256 checksums are used to see if the underlying data is already stored, and if so a new entry is not created, but a ref count is incremented instead. The opposite happens on deletion.

The ResourceCatalog is not available externally - it will be used by the upcoming ManagedStorage implementation.
> The id is supposed to be opaque so even though it is composed from the hashes, I didn't want to encode that assumption in business logic, thus allowing the id implementation to change later.

You don't need to expose it anywhere, just make use of it within this package. The API and usage would not change.

> I also wanted to allow for the future ability to search for data based on matching md5 or sha256.

Okay.