applyChannelReconciliation

Re-keys conversations after the radio's channel set changed, applying a plan from planChannelReconciliation.

Conversations are keyed by channel index, so a slot that changes occupant would otherwise show the previous channel's history under the new channel. Each change moves one conversation: to another slot (the channel was reordered), to a retired key (the channel is gone), or back from a retired key (the channel came back).

Direct messages move with their slot but are never retired — a DM is a conversation with a node, not with a channel, and losing that history because the channel set changed would be worse than the misfiling this repairs.

All the rows that will move are read before any is written, so a slot swap cannot double-move a conversation.