A handle for waiting on the return values of remote procedure calls. This is necessary because calling a remote procedure
requires .flush() to be called, so waiting inside a function like .call() would make very little sense.
A wrapper that allows receiving message chunks in real-time. Be mindful that, once one of these is created,
all chunks that arrive for the message it tracks will be immediately sent to it, thereby preventing any
calls to .get() on the Interface from accessing non-empty data.
The status each call/response message holds about how it is terminating its
series of messages. Generally, this would be a boolean (Terminator::Complete
or Terminator::None), but Terminator::Chunk is introduced to allow for
procedures that stream discrete values, which must later be deserialised, which
requires knowing how many of them there are. Explicit chunk marking allows for
both flexible operation and simultaneously clear typing.