fix(display-watcher): use shared 50% stranded threshold instead of local 30%
display-watcher's Pass 1 used a 30% overlap threshold to decide whether
a window was accessible; window-placement's stranded rescue used 50%.
A window in the 30-49% band would skip Pass 1 (treated as accessible)
yet trip Pass 2's stranded rescue, doing the work twice with two
disagreeing definitions of off-screen.
Export maxOverlapFraction and isStranded from window-placement.ts (typed
against just the workArea field so DisplaySnapshot satisfies the
interface) and have display-watcher's isWindowAccessible delegate to
isStranded. Single source of truth for the threshold.
Tests: updated the local mirror in display-watcher.test.ts to match,
including a regression case that asserts a 30%-overlap window is now
correctly classified as inaccessible.