dispatch Event
Dispatches the given event to the registered listeners.
The event must either be a GenericEvent or a BEvent, passing neither of them is a no-op.
Execution model
This method will block until all BLOCKING listeners, are fired and have returned.
ASYNC listeners will then be launched on BCoroutineScopesConfig.eventDispatcherScope, without blocking.
Finally, SHARED listeners will be fired on the scope of the CoroutineEventManager without blocking, which can be configured with ICoroutineEventManagerSupplier.
Any thrown exception will be logged separately and do not affect other listeners.