restructure how the message broker processes a message

- added a MessageProcessor interface
- don't return a func but instead a MessageProcessor ref
- do metrics within the MessageProcessor
some feedback from @peterbourgon :)
remove the need to keep the Channel around