Add a layer of immutable classes that delegate to the actual user provided marshallers

* This allows for storing of immutable metadata in the delegates rather than needlessly computing this info when starting a nested context leading to better performance