Minor tweak to consume
Inline try code into _on

try is only called by _on, it completely wraps _on and is never
overridden, so remove the method and inline the code into _on.
Saves a method call and yield for each match block.
Remove _halt method, use throw directly

_halt just called throw, which doesn't really get you much over
calling throw directly.  This saves a method call per match block.
Add hash_matcher class method, for easily creating hash match methods

This is simpler for users than creating match_* methods manually
in the request class, though that still works fine.
Add :opt and :optd as default symbol matchers in symbol_matchers plugin

I've wanted to add the ability support optional segments, which
because of how the matching works isn't simple.  Matching is
designed to match only segments starting with a non-optional
slash, so you could get 'foo', :opt to match  /foo/ and /foo/bar,
but not /foo itself.

I thought of two ways to implement optional matchers.  The first
was adding an :optional hash matcher, which attempted the match,
but if the match failed, returned true anyway and yielded nil.
That actually works, but it is a bit more verbose.  It does add
flexibility, but for optional matching I've always had a fixed
prefix.

For a fixed prefix, this allows you do to:

  r.is "foos:opt" do |id|

which will match /foos (yielding nil) and /foos/bar (yielding
"bar"), but not /foos/ or /foos/bar/baz, which is what I want,
and I think a simpler and more performant approach.