Add Router::prefix() and Router::plugin()

Add these methods here as well as on the scoped collection, so we can
have a similar interface in both places.
Start integrating Router + new route collections.

This also removes Router::promote(). I feel this was infrequently used,
and can be better accomplished by correctly defining your routes.
promote() becomes very difficult when we start segmenting/sharding the
routes as is done with scoped collections.
Start fixing up the few failing router tests.
Add ability to inject route instances.

Being able to inject route instances makes testing a few different
scenarios easier. It also follows the patterns in Cache, and Log.

This change also simplifies instance checking for routes.
Remove Router::defaultRouteClass()

This method doesn't work very will with the scopes, and is the kind of
thing that I don't think many people ever even used. Now that you can
easily inject instances, I don't think it is as important either.

Fix a number of tests that been failing as well.
Router::parseExtensions() only works at the top of the routes.

The global methods still mostly work like before, but with limitations.
Router::parseExtensions() now should only be used at the top of the
routes file. After that, extensions() should be set on the individual
scopes.
Remove RouteCollection

This class is no longer needed/used.
Fix failing tests and issue where / would be incorrectly handled.
Raise exceptions when scopes and routes have conflicting parameters

Having a scope contain a route with different parameters is most likely
a mistake. In addition it will defeat optimizations for reverse routing.
Add a small optimization for reverse routing.

There is no reason to check the routes of a collection if the scope
parameters don't intersect with the URL parameters.
Sort routes when scopes are connected.

This solves errors/performance issues when Router::url() is called
before Router::parse().
Fix error in Router::redirect().

Type warnings would be emitted when redirect() was called with a string
target.
Move special casing for redirect routes into RedirectRoute.
Fix plugin scopes not correctly setting their params.

The `+` operator was not working as plugin = null had already happened.
Index routes by key parameters for faster reverse routing.

By indexing routes along the main places people will partition routes
(plugin and prefix) we can make reverse routing faster by only looking
in specific route collections.

Redeclaring the same scope with different plugin/prefix values might get
hairy and may need special casing.
Merge pull request #3825 from markstory/3.0-router-scopes

3.0 router scopes