Add event system to abstract inputs

this way controls can have multiple inputs or control things they don't
display. The keyboard/gamepad input system can hook into the same events
and the systems don't have to know where the input came from