Add route predicates

Route Predicates allow for more generic preconditions to be applied to routes.
These are applied by the routing engine rather then the route executor, as such
other routes can be matched.

Route Predicates are especially useful when used in conjuction with filters, for
example:

@Before
@Any("**")
@PathFilter(path = "/some-route", action = PredicateAction.REJECT)
public void filter()
{
}

In this instance the filter would match all requests except for /some-route for
the given prefix.

Currently two predicates are implemented @PathFilter and @PathFilters, @PathFilter
uses Java 8's repeatable annotations support to be enclosed into a @PathFilters
annotation.  @PathFilter allows for a route to filter on the request path.