initial implementation of extension matching

smallest possible code change - needs to be made resilient now. but it
basically seems to work.
route validation moved to a separate class

much nicer error reporting, and simpler to incorporate into javascript.

more changes are likely coming, however.  there are weird corners - like
parameter name duplication
integrating the new route validation

errors should be a heck of a lot more understandable now, if nothing
else
changing internal ParamNode validations to assertions

always run the validator first! that's the lesson i am trying to teach
calling code

one last piece to add, which is the extension nodes after static nodes.
right now it'll just blow on by that one :D
extensions work past static node

this should conclude parsing extensions out of routes.  now to validate
that the generation side works!
adding a test to the validator

ensuring that static route segments obey extension rules
extending the test

ensuring that extension separation only happens in the last segment,
otherwise it's just static
efficiency improvements

making sure that '.' characters are treated statically and compressed as
such when not in "terminal" position

also refactored out some duplicate code
Merge branch 'feature/routing-extension-node' into develop