Add support for 'around' callbacks and conditionals using proper chain

Middleware isn't always sufficient if you need access to endpoint
values, e.g. parsed version and content-type. The 'around' filter is
much more complex to implement, but the result is extremely flexible.

This brings Crepe callbacks much closer to ActiveSupport::Callbacks,
without much of the complexity and compatibility issues that will come
with actually using ActiveSupport::Callbacks. AS callbacks are stored
in class variables, meaning we can't have different chains for each
endpoint instance, and we can't use the underlying AS classes because
AS 4.1 rewrites the Callbacks implementation completely.

This does increase the stack depth significantly, so we'll probably
want to do some benchmarks to make sure this isn't slowing things
down unacceptably.

Signed-off-by: Evan Owen <kainosnoema@gmail.com>