Use std.signals for event distribution.

Our implementation of the Observer was flaky at best.