move route handling to stores

the components don't need to be aware of the routing, they just consume
state from the stores. the router now listens to store change events to
generate the current hash path, and hash change events to update the
state and initialize the application correctly