refactor(redirect): make redirect a general concept understood by navigation

There was previously a special casing to detect a Redirect object
returned from the processing pipeline. This change reworks that to allow
any object that conforms to a particular interface. The interface allows
for the execution of custom code in response to a navigation
instruction. The Redirect class now implements this interface. The new
category of objects is called "navigation command". If such a command is
returned from the canActivate callback of a component, we will also
capture the controlling router from the hierarchy and assign it to the
command. This allows for the possibility of relative redirects. That is
not implemented yet, but this lays the foundation. In the future, this
will implemented directly within the navigate api of the router so that
it can be used by the Redirect command, but also by any custom
directives that may trigger navigation.