The server is synchronous and single-threaded for now. The server
uses a RequestProcessor to process requests, which, unlike the
previous `fn(&Request) -> Response` server functions, can hold
state and use that state when processing requests.
In short, the server can now be used for real tasks. Multithreading
will be added back in for a future release, the current single-
-threaded code will not perform well under concurrent loads.
Before, the partially constructed byte sequence for the request was held outside of the Request object, and each time the program tried to create a Request out of the byte sequence the entire sequence would need to be re-parsed. Now, a Request is constructed up-front, and bytes are periodically pushed to it. This enables the library user to parse more efficiently, by keeping partial parse results inside the Request object and only parsing bytes when they're new to the Request.