After either receiving or instantiating a `Request` object instance, the `Dispatcher` passes that
instance to the `Router`, which produces the parameters necessary to dispatch the request
(unless no route matches, in which case an exception is thrown).
Using these parameters, the `Dispatcher` loads and instantiates the correct `Controller` object,
and passes it the `Request` object instance. The `Controller` returns a `Response` object to the
`Dispatcher`, where the headers and content are rendered and sent to the browser.