You can't current stream using mfuncs / session functions because we await the model output thunk before returning it. We should change it to where we pass back uncomputed model output thunks when possible (ie when not doing sampling).
As a part of this, we should make a subclass of model output thunk that is always computed. We can return that from the synchronous functions so that there is a clear delineation of when you are expected to await the computation. We can also do that for asynchronous sampling / sampling strategies.