Decouple DeviceCatalog from the memory storage backend

closes #8