Return the current presence snapshot for all active viewers of a deal.
Each entry in viewers contains:
user_id — authenticated user identifier
user_name — display name (if known)
deal_role — owner | editor | commenter | viewer
editing_sections — list of section keys the user currently holds
edit-locks on (empty if just viewing)
connected_since — ISO-8601 UTC timestamp of first connection
Multiple tabs from the same user are merged into a single entry with
their editing_sections sets unioned.
In multi-worker mode, viewers from other workers are merged via the
WebSocketManager’s get_deal_presence() method, which queries the
Redis pub/sub bridge’s presence sorted sets internally.