A “background” asset processor that reads asset values from a source AssetSource (which corresponds to an AssetReader / AssetWriter pair),
processes them in some way, and writes them to a destination AssetSource.
The “current” in memory view of the asset space. This is “eventually consistent”. It does not directly
represent the state of assets in storage, but rather a valid historical view that will gradually become more
consistent as events are processed.
A “write ahead” logger that helps ensure asset importing is transactional.
Prior to processing an asset, we write to the log to indicate it has started
After processing an asset, we write to the log to indicate it has finished.
On startup, the log can be read to determine if any transactions were incomplete.
Asset “processor” logic that reads input asset bytes (stored on ProcessContext), processes the value in some way,
and then writes the final processed bytes with Writer. The resulting bytes must be loadable with the given Process::OutputLoader.