feature: Input state handling
Add input handling to the engine.
Input handling comes in two forms:
- Querying active input state at a given point in time (e.g. "Is the W key pressed right now?")
- Parsing and operating on individual input events (e.g. "Perform an action for every time the W key has been pressed")
Each window will maintain an overall InputState which allows for the first method, querying. These InputStates will then allow you to register "delegates" which receive copies of input events, allowing for the second method. As shorthand, each delegate also contains the querying API.
For situations where particular "layers" of input need to effectively lock input handling - such as when a text field like a chatbox is active, and the underlying game input needs to be suspended - delegates can "lock" themselves with a priority. Only the highest priority locked delegate will receive input events if any delegate is currently locked.