acceptData and data-route optimizations

This adds two optimizations I found while benchmarking our app.

1. `acceptData` is called for each node every time we want to use the data expando. This memoizes the result on the node to avoid unnecessary checks

2. `RouteMap#routeForParams` is used by the `data-route` binding. Every time you `data-route`, this calculates the route for the given params by walking the entire set of routes.  This simply caches the value to avoid the lookup.