Handle race condition between lazy engines:

The template, session, and serializer engines depend on the logger
engine, but since they are all lazy and built by other objects using them
or the configuration being built, it's impossible to know which will
be built before which.

Additionally, the logger was sent to other engines without knowing if it
exists yet or not. If it won't get built (unlikely since it actually has
a default), that's not as problematic (except the serializers actually do
try and log), but it's much more problematic when they will be created
but haven't yet when the other engines were created.

For example, if the serializer is built before the logger is built, the
serializer will not be able to log, even though by the time it *should*
log, a logger is available.

Instead of currying the logger or making the engine create other logger
instances, we just send a callback ("log_cb"), which will log using the
original app's logger.

We weaken it since it otherwise creates a cyclic reference (and thus a
memory leak unless weakened) - THANK YOU RUSTY for providing the test for
it. :)

additionally, since the callback defaults to "sub {1}", we don't need a
predicate and it's safe to always call ->log_cb->(...).

This resolves GH #770.
reflect change
Merge branch 'fix/serializer-logging'