Improve mouse event handling

    * The which field in various mouse event structures is now a proper sum
      type.
    * Mouse motion event returns a list of buttons that are currently down.
Move some mouse data from SDL.Events to SDL.Input.Mouse
Add a "catch-all" mouse button

This is necessary because the buttons defined by SDL (left, middle, right, x1,
x2) do not include every possible mouse button.

I know this can happen because I pressed a special button on my mouse and it
crashed SDL.Events because there is no matching clause for the extra button.