move all server routing concerns into a `Router` object

This defines a new object, `Router`, that encapsulates all routing
concerns for a server.  This also updates the server's routing
and configuration to use a router instance.

There is no change to the Server api.  You still define routes on
a server like you did before and everything works as it did.

This does add some new routing options.  You can now define a router
independent of the server.  This allows you to define and access
urls and routes without _having_ to define and initialize a Server.
You can define a custom router and tell your server to use it.

To summarize, this decouples routing from server definition.