Sometimes we want to be able to pass in a sender that has not yet been fully constructed.
LateBoundSender can act as a placeholder to pass CanSend and CanSendAsync capabilities
through to the inner object. bind() should be called when the inner object is ready.
All calls to send() and send_async() through this wrapper will block until bind() is called.
Wraps a CanSend. This should be used to pass around an Arc<dyn CanSend>, instead
of spelling out that type. Using a wrapper struct allows us to define more flexible
APIs.
Trait for handling a message.
This works in unison with the CanSend trait. An actor implements the Handler trait for all
messages it would like to handle, while the CanSend trait implements the logic to send the
message to the actor. Handle and CanSend are typically not both implemented by the same struct.