Initial refactor of input handling

Interfaces now use enums. Added intermediate input handing classes with
internal state structs; must write implementations for different
platforms to provide the correct states. Will break the build; needs
fixing on windows.