Refactor joystick APIs. Joystick logic has been separated from API logic

Many TODOs are present and have been left for later while the groundwork
is being laid. Code is untested and won't work until some of the TODOs
have been taken care of.
Merge button and analog stick abstraction