events are generally redirected to widget's event handlers

States:

- PressedState: pressed mouse buttons, stores for each key
    - key id
    - start WidgetID
    - start pos
- HoverState
    - hovered WidgetID or None
- DragState

Fns:
- WindowMouseLeave
    - if DragState
        - try serialize DragData to clipboard
    - Reset HoverState
    - Reset DragState
    - set mouse off to None
- WindowMouseMove
    - if mouse off is none (so the mouse just entered window (again))
        - Try Read Serialized Drag from Clipboard
    - send MouseMove into root widgets
    - the last set WidgetID is the hover candidate
    - if key 0 is down (PressedState) and DragDistance is reached
        - set DragState to current WidgetID
    - if DragState
        - probe if currently hovered Widget supports Drop
- MouseMove
    - Set current WidgetID as hovered in HoverState
    - Call WidgetEventHandler

- WindowMouseDown
    - set key and pos in PressedState
    - send MouseDown into root widgets
    - set pressed WidgetID as selected in SelectedState
- MouseDown
    - Set current WidgetID in PressedState at current key
    - Call WidgetEventHandler

- WindowMouseUp

    - if mouse key 0
        - reset DragState
