Callback handlers are now idempotent.

The sandbox demo now uses a list of callback handlers with
separate trigger and commit phases. Idempotent work should
only be done during the commit() call. Temporary work can
be stored in the callback's 'scratchpad' dictionary until
commit() is called.
random explosions ... remove later