A simple framework-agnostic event dispatcher