INativeWindow cleanup and consolidation

This PR modifies all `INativeWindow` implementations to inherit from a common `NativeWindowBase` class. A large amount of duplicated code, especially regarding window events, position, size and keyboard/mouse input has now been consolidate in `NativeWindowBase`.

A large amount of inconsistencies in keyboard handling and window size/position events have been fixed. Key modifiers work as expected now on all platforms.

New `MouseDown`, `MouseUp`, `MouseMove` and `MouseWheel` events have been added directly to `INativeWindow` without passing through MouseDevice first. All keyboard and mouse events now carry the current `KeyboardState` and `MouseState`, respectively, to simplify event-based keyboard handling.

Horizontal scroll wheels are now supported on Windows Vista+, Linux with XI2 or Mac OS X 10.7+.

The legacy input structures are now handled by a common LegacyInputDriver, instead of being reimplemented in each backend separately.

PointToSize and PointToClient now works correctly under HiDPI displays.