Add decent event dispatcher

Covers #15 
see #4