We should probably extend TypeLiteral to support:
In Event.fire() we'll need to add a check that the event object implements the type