The new IDirectRouteProvider api supports discovering IRouteFactory
on controller descriptors and action descriptors with arbitrary criteria.
DefaultDirectRouteProvider is given as a base class for customizing a
single aspect of the process.
Since criteria for whether or not an action/controller is attribute
routed is now arbitrary, I've added a marker to the descriptors. This
required some refactoring of the action selector, now caching proceeds in
two phases.
1. Existance of actions and descriptors are cached
2. Details used for action selection are cached.
2) will happen when requests come in, so attribute routing is allowed to
mark the descriptors before they are cached.