create call_submodel methods to use instead of getting the submodel
manually and then calling it. This call also handles input checking,
result buffering (for automtic colleciton later).
the submodel returns are now stored in a buffer after it is called.
The buffer is cleared when the submodel outputs are collected.
to avoid contamination of results in the buffer:
1) a RuntimeError will be thrown if the corresponding buffer entry
already exists when a submodel is called (eg, happens when one calls
the same submodel twice before outputs collection)
2) a KeyError will be thrown if the outputs collection happens before
all submodels are called
call_submodel
methods to use instead of getting the submodel manually and then calling it. This call also handles input checking, result buffering (for automtic colleciton later).