Use assertTrue instead of assert_ in tests
Store/find paths for mounted resources in tree

This is intended to make resource lookup faster in cases where there are
a lot of mounted resources.

Previously, requests would be matched by doing a linear search through
the list of registered paths--a request's entire path would be compared
to each registered path in turn and break if a match was found. That was
O(R) where R = number of registered paths.

Now, when a resource is mounted, its path is split and inserted into
a tree. A request's path is split and then a depth first search is
performed to locate a matching resource. In the optimal case, this is
O(log(S)) where S = number of segments in the request's path path; S is
also bounded by the number of segments in the longest registered path.
In the worst case, this is O(R * log(S)).

The idea is that in most cases valid request paths will be matched
faster (closer to the best case) and non-matches will short circuit
faster while doing less regex matching overall. The tree approach also
makes it easy to skip matching for request paths that are too short or
too long (by comparing the number of segments to height of tree).
Fix/improve converter regex for mounted resource URL vars

Previously, it was just [a-z]+, which meant some of the converters
provided by tangled.converters couldn't actually be specified. Now, any
valid Python identifier can be specified. In addition, paths like
'package.module:callable' can now be specified so that arbitrary
converters can be used.