Types of events that can be handled by the DAGScheduler. The DAGScheduler uses an event queue
architecture where any thread can post an event (e.g. a task finishing or a new job being
submitted) but there is a single "logic" thread that reads these events and takes decisions.
This greatly simplifies synchronization.