SaturnPlayer stored non-Saturn players as null, which looked the same as
"not fetched yet", so every render re-queued them and flooded the server
with get_player requests. Remember negative lookups and re-check them
after 60 s, retry failed lookups after 5 s, queue each player at most
once, skip lookups while disconnected, and replace the hand-rolled worker
thread with a single-thread executor.
getPlayer now returns null only when the server says the player isn't on
Saturn and throws on failure, so failures are retried instead of cached.
Make state shared between network callbacks and the render thread safe:
ConcurrentHashMap for players, CopyOnWriteArrayList for owned cosmetics,
volatile session/uuid and cosmetic fields, and run emote notifications
on the client thread.
Refs saturnclientmc/saturnclient#2, saturnclientmc/saturnclient#6
Co-Authored-By: Claude Opus 5.5 <[email protected]>