Add support for state pass-through to protocols

The Bundler is an option you can pass to your protocol creation.

The output of Bundler (a list) is prepended to the output list of
any of your protocol parameters before being applied to your protocol
action function.

This change also requires protocol functions now be specified as
{Module, FunctionAtom} instead of a direct fun function/arity as
before.

Each element in the return list of your Bundler increases
the arity required of your handler functions.  Because we can't
know the arity up front, we have to switch to apply/3 and away
from calling Fun() directly.

All tests pass.