Refactor ProtocolStream:

* Rename class
* Remove handler state variable
* Use template instead of abstract class for polymorphism
* API processes one message at a time instead of many
* Remove error_code from the ProtocolHandler concept requirements

Reviewers: @scottschurr, @nbougalis 

Note: This includes the `std::exit` commit from another pull request.