added Keyboard class. apparently large commit, possible unsynced changes previously