implement before, after, around method modifiers

Implement @before, @after and @around method modifiers as
decorators.  The name of the method to modify is given as an
argument to the decorator.

All modifiers receive the same arguments as the original method.  As
in Moose, @around modifiers are applied before @before and @after,
i.e. they are called after @before modifiers and before @after
modifiers.  Where multiple modifiers of the same type are defined,
they are applied in the order they were defined.

The @around modifier is implemented using generators.  A single
``yield`` statement must appear in the modifier function body.  The
original method is called ("yielded to") at this point.

Include tests for the basic modifier functionality.