arena: spectator polish — hide own body, see own avatar, leave on exit
Three user-visible fixes in the multi-tab flow:
1. Local body (feet/arms, plumb line, shadow) was still rendering
while spectating, making it look like the spectator cam had a
ghost body. Now gated on !netSpectator — when another tab takes
over, this tab shows pure noclip free-fly cam.
2. Spectator couldn't see themselves being driven by the other tab.
onSnap previously routed any p.h === myHandle blob to
myServerState and dropped it from the renderable-remotes set.
Now, when netSpectator is true, the "me" entry is *also* pushed
into the interpolation buffer so paintRemotes draws it like any
other stick figure. Cleanup on returning to play mode: drop the
self entry from `others` so paint doesn't double-draw.
3. Added a leave() export that sends arena:bye. Without it, the
server had to wait 30s (stale sweep) before removing the player
after a navigate-away. Now it's instant.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>