So, it looks like this is only called in `sendAction()`. I think we can change this a bit to just use completers and futures, instead of a single-shot stream. Something like:

- sendAction creates and registers a completer for the event id
- it returns the completer.future
- when the response is received, the completer is removed from the map and completed with the async responses value