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.
Deduplication seems like an implementation detail. It doesn't affect the interface. Perhaps it'd be better to say something like "an implementation may use the resource's hash to deduplicate".