Introduce the concept of a middleware stack

In order to make PB more extensible, this introduces the concept of a middleware stack. Building off of #144, the middleware stack is invoked from the server and terminates at the dispatcher. The dispatcher returns an error or response proto which is then added to the response wrapper accordingly.

// @localshred @abrandoned @brianstien @devin-c