Store path in state

Alright, here it is. I think this breaks down the responsibilities a little more cleanly. Namely,

- The RoutingEnvironmentMixin binds environment changes to the component's state
- The RouterMixin determines if paths match and renders based on the component's state

That means to implement a custom Router, you need to mixin RoutingEnvironmentMixin and implement a custom `match()` method. Honestly, I'd like to remove even that requirement (so that you could simply implement a `render()` that uses `getPath()`, but there are a few places where `match()` is used that I'm not sure how to get rid of.

Also, there's a potential issue with the `match()` call in `RoutingEnvironmentMixin.onBeforeNavigation`: since it's called before the new render, it may be inaccurate if the routes change. This is a fundamental problem with the dynamic reconfiguration of routes, though—you can never know prior to rendering if you have a match or not.