Streamline twoway input handling

Instead of polling the current keyboard state, use keyboard event data