implementation of Asset Storage
This diff moves the dagster type loader and materializer invocation from execute_step.py to intermediate_storage. It also adds an asset cache in it, which is a mapping from asset.key to a list of assets and will be used to support versioning and memoization.
It creates a base for intermediate storage (which we plan to rename to asset storage) to
- handle step_input loading cases (from intermediate if it has intermediates, from config if value provided via config or loader set)
- status-quo: _input_values_from_intermediate_storage
- handle step_output materializing cases (set intermediate or use materializer) and therefore merge the intermediate and asset materialization.
- status-quo: _create_output_materializations
- merge the cases described above in intermediate storage
- start working on the user-facing api design - how we can enable data to be passed by reference + reduce boiler plates for users to specify that option