[Win] Faster WinMM GetCapabilities() and GetState()

joyGetDevCaps() is an extremely slow call that allocates memory.
WinMMJoystick is now caching its results for a significant speedup in
Joystick.GetCapabilities() and GetState().

The cache is updated whenever a joystick device is removed. WIP to
handle device added notifications.
[Input] Added structures for joystick hat input
[Input] Added JoystickHatState structure
[Input] Do not use a bitfield for hat position

Using a bitfield does not save storage space in this case, and also
stops pattern matching from working (switch() statement in C# or match
… with expressions in F#.)
[Input] Added hat state to JoystickState
[SDL2] Implemented support for hat state
[Input] Added JoystickCapabilities.HatCount
[Mac] Implemented JoystickHat support
[Input] Fixed compilation error
[Input] Fixed SetButton index check
[Win] Cache WinMM joystick capabilities
[Win] Query WinMM joysticks on devicechange event
[Win] Do not create second WinMMJoystick instance
Merge branch 'joyhat' into develop