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 interface is affected in that 
Put(rh *ResourceHash) (id, path string, isNew bool, err error)
will return isNew=true is a new catalog entry is created, and isNew=false if not. The managed resource stuff which will use this work will:
i. call Put() to create a catalog entry
ii. if isNew, then the resource data will be persisted, if not then nothing is saved

The term 'Resource' in the doc refers to the Resource struct which will not be created twice if the hashes match.