implementation of Asset Storage
This diff creates Asset object to store the information of either a reference of the physical data object or the value of a data object.
A unique identifier of an Asset would be the combination of key and value its reference or value.
It lays a foundation for the intermediate and AssetMaterialization unification: each asset will point to a unique loaded or materialized data object no matter it's through dagster type loaders/materializers or intermediates, which means asset would be the base unit of a "data object" loaded to step_input or generated by step_output.
We will maintain a mapping from asset.key to a list of assets to support versioning and memoization.