refactor use of cache

This simplifies how cache is handled. Removes the responsibility of calculating keys from the response from the backend and moves it to the engine. This will make soon future additions of allowing objects calculate their own key, "refresh" themselves (by bypassing the cache and resetting), and deleting themselves from the cache.

The above features are a quick addition once this overhaul is approved.