fix(session): collapse restored windows to primary display when topology changed
Reconnecting / re-arranging displays between save and restore left
windows stranded on now-secondary screens. Saved bounds whose center
landed on the laptop (no longer primary) survived the existing
isPointOnScreen guard because the laptop was still attached, just
no longer primary — half the user's session would restore there.
Single-display restore policy (we don't try to remember multi-display
layouts yet): at restore, any saved window whose center isn't on the
current primary display gets re-centered on primary, with size
clamped to fit. Placement intent (`center: true`, `screenEdge`) is
cleared on rewrite so the explicit primary-centered coords reach
window-open instead of computePlacement re-deriving against the
cursor display.
Pure helper `collapseToPrimaryDisplay(descriptor, primaryWorkArea)`
takes the workArea as a parameter so unit tests don't need Electron's
screen module. Six new tests in session.test.ts cover: pass-through
on primary, re-center off-primary, intent-clear on rewrite, size
clamp, downstream interaction with buildRestoreBoundsOptions, and
the half-open primary-edge boundary.