Implement a simple signal (event) architecture

This will allow for the eventual introduction of plugins