Previously, every rebuild created a new FocusNode, so KeyboardListener never
held focus and missed key events on macOS.
This change:
- Moves the FocusNode into state and initializes it in initState
- Requests focus once after the first frame
- Disposes of the FocusNode in dispose
- Removes the inline FocusNode creation from build