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.
Add lazy reading of cookie data.

Individual cookie values are now read on an ad hoc basis as they are
accessed. This alleviates issues where javascript libraries add cookies
that CookieComponent does not know about. Previously, these cookies
would trigger encrypted cookie warnings.

Unfortunately reading cookies lazily means we don't have a way to read
*all* cookies.

Refs #3814
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.
Merge pull request #3827 from cakephp/3.0-lazy-cookie

Add lazy reading of cookie data.
Removed unused test file.
Move special casing for redirect routes into RedirectRoute.
Merge pull request #3834 from ADmad/3.0-cleanup

Removed unused test file.
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.
Remove dead code.

This code is safe to remove as it can never run.

Closes #3839