Drag and drop

This PR implements drag and drop using an event filter. A widget can be dragged by setting its `drag` attribute to a Drag object. A widget can accept drops by setting its `accept_drops` attribute to a Validator object. Once a widget accepts drops, it will receive the following events: `drag_enter`, `drag_leave`, `drag_move`, `drop`.

This PR also fixes a crash that occurs when using the docking system with PySide (PySide has no equivalent of the Qt/PyQt WA_MacNoShadow flag).