Fix registering plugins section of README to use correct module
Optimize r.is terminal matcher, remove :term hash matcher

The terminal matcher added by r.is is very common, so it deserves
an optized implementation.  This makes RodaRequest::TERM an empty
frozen object, which will only match itself in a case statement,
and adds an additional case to r.match.

While the term matcher was documented in the README, it wasn't
actually used in the specs, and it's unlikely someone is using
it directly.
Add r.root for matching root (path "/"), for easier to read version of r.is ""

I think r.is "" is a little bit strange for new users.  It makes
sense once you understand how the string matching is done, but
considering that matching the root is very common (every app does
it), it doesn't hurt to have a dedicated method for it.  This
should hopefully make Roda more approachable.

Cuba has a similar method, but Cuba's method matches either the
empty path or /. I didn't think that was a good default as it
leads to non-canonical routes, so I removed it earlier.

As this doesn't consume the "/" from the path or use any regexps,
it is probably faster that r.is "" as well.
Use r.root on website
fix halt plugin rdoc quote mismatches
Remove section on status codes from Cuba comparison

Cuba took Roda's approach of checking for an empty body, so now it
works similarly to Roda.
Optimize matching by caching consume regexp for strings, regexp, symbol, and :extension matchers

This significantly speeds up matching by caching the underlying
consume regexps.  Previously, consume always built the underlying
regexp every call, which is expensive.  This changes consume so
that it takes the regexp to use, so it can be passed directly.

This caches the patterns in the request class, and uses the
caching for strings, regexp, symbols and the :extension matcher.

Note that this is a backwards compatibility break for consume,
so any users calling it directly need to update their code to
use the caching.

I don't expect that users are dynamically constructing match
patterns, but if they are, this is a potential memory leak. If
any users report doing that, I'll add a plugin that disables
the caching.
Fix tilt requires in render plugin spec

This avoids a warning on Rubinius.
Add Roda::RodaCache for a thread safe cache, currently used for match patterns and templates

Instead of duplicating the cached_matcher method, this makes the
underlying cache object thread safe.

Since similar caching is used for templates remove the Render::Cache
class and just use a RodaCache instance for caching, inlining the
fetch code into cached_template.

This simplifies things significantly, and is also faster on MRI
since template caching no longer uses a mutex there.
Support RequestClassMethods and ResponseClassMethods in plugins

I don't have immediate plans to use this,  but now that there is
non-trivial logic in the request class, there should be a way to
override that logic via a plugin.
Use RodaCache for the plugin cache

This is simpler and also faster on MRI as it avoids the mutexes
there.
Optimize r.is, r.get, r.post and similar methods by reducing the number of Array objects created

Instead of splatting arrays multiple times, add an _on method that
takes an array instead of multiple arguments, and have branching
methods call that.
Rename is_or_on private method to _verb
Fix description in pass spec
Add csrf plugin for csrf protection using rack_csrf
Add symbol_matchers plugin, for using symbol-specific matching regexps

Previously, this wouldn't have been a good idea as it slows down
the general case to much.  However, now that the matchers are
cached, there is no performance hit for this added flexibility.
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.