Symptom: for one player, /s (and anything that runs it) does nothing: no UI,
no chat message, nothing in the console or oxide log. Everyone else can use the
store. It persists across that player's relogs until the plugin is reloaded.

Cause: UIUser caches the BasePlayer and is never refreshed or removed on
disconnect.

- UIUser (line 2218) stores `public BasePlayer Player;` (2220), set once in the
constructor (2240).
- UIUser.Get (2310) looks the entry up in the static `Hash<ulong, UIUser>
UIUsers` (2308) by player.userID and returns the cached object; a new one is
created only when there is no entry (2316).
- The only places an entry is removed are CloseMenu (2273, `UIUsers.Remove
(UserId)` at 2276), reached from the close button (srui.close, CommandClose
2678) and from the NPC no-categories case in OpenStore, and OnUnload (2321).
The plugin has no OnPlayerDisconnected / OnUserDisconnected handler.
- SendUI (2265) and SendToast (2289) call `CuiHelper.AddUi(Player, container)`
with that cached reference.

The game destroys the player's entity in two common cases and spawns a new
BasePlayer when they join again: BasePlayer.OnDisconnected calls KillMessage
when the player disconnects while dead (only an alive or sleeping player
becomes a sleeper), and BasePlayer.OnDied calls KillMessage when a sleeper is
killed (net.connection == null). After the rejoin, UIUser.Get(newPlayer) finds
the entry keyed by the same userID and returns the old UIUser, whose Player is
the destroyed entity. CuiHelper.AddUi sends to a connection that no longer
exists and returns false, which the plugin does not check, so nothing happens
and nothing is logged.

Reproduce:
1. Open the store with /s and leave it open.
2. Get killed, and quit from the death screen without respawning (or
disconnect with the store open and have your sleeper killed).
3. Join again. /s does nothing from now on. `srui.close` typed in the F1
console removes the stale entry and /s works again, which confirms the
cause.

Suggested fix: in UIUser.Get, refresh the reference when it differs
(`if (!ReferenceEquals(user.Player, player)) user.Player = player;`), and add
an OnPlayerDisconnected hook that calls CloseMenu for that userID so the pooled
list is freed and the entry does not outlive the entity.