lib.observable: log methods that fail before call

Observer methods are sometimes registered which raise exceptions before
their stack frame is entered, e.g. when required parameters are missing.
This can be uninformative in the stack trace, so log the registered
observer to make the error messages a bit more useful.
Frame observers: replace with fine grained @events

Replace the old frame_observers mechanism with observable events that
report which document the change originated on.

Closes #22

Old and new frame sizes are now reported to observers, so this could be
used for rendering cleaner updates in future.