Move to opaque JSON protocol, add multiplayer