If you can figure out a way to only send inputs for each player instead of their full state, it should significantly reduce network traffic and lag for each player-- right now it's sending ~1KB/frame!
I tried only sending updates every 3rd tick, but even there I could notice the difference.
You're right that it'd be worth experimenting with sending keystrokes instead, and backing off the full resync to once/second or so.
There are many other methods, some are more precise and compressible than others:
Trailing State Synchronization
https://www.cs.ubc.ca/~krasic/cpsc538a/summaries/38/
Basic ideas
https://www.gafferongames.com/post/state_synchronization/
https://engineering.monstar-lab.com/2021/02/09/Game-server-S...
https://www.gabrielgambetta.com/client-side-prediction-serve...