Add Join() method to Broker

Oh, sorry! Functions that are run synchronously will return their errors to the caller (which will be the CLI) and the CLI will log those errors.

The `messaging.Client.streamer()` function executes asynchronously in a goroutine so it can never bubble errors up any further. Since the CLI will not receive these errors it can't log errors so it's the responsibility of `messaging.Client` to log them. That's what I mean by "out-of-band errors". They occur outside the primary flow of execution.