Event[T] = object
proc invoke[T: void](event: var Event[T])
proc invoke[T](event: var Event[T]; arg: T)
proc subscribe[T: void](event: var Event[T]; callback: () -> void): Id
proc subscribe[T](event: var Event[T]; callback: (T) -> void): Id
proc unsubscribe[T](event: var Event[T]; id: Id)