It is unclear how the UTransport::receive function handles situations where no message is (immediately) available on the given topic, i.e. when will the returned future be completed?
async fn receive(&self, topic: UUri) -> Result<UMessage, UStatus>;
FMPOV the function should accept an argument indicating for how long the client wants to wait, e.g. 0 = fail immediately if no message is available, and t > 0 = fail after t milliseconds without a being message available:
async fn receive(&self, topic: UUri, timeout: u16) -> Result<UMessage, UStatus>;