fix: stop destroying sidebar rows mid-handler; async daemon spawn
Two changes that together remove a reproducible crash: two or more addWorkspaceDirect calls in one event-loop turn killed the app with "Object ... destroyed while one of its QML signal handlers is in progress". Root cause: DaemonLink::requestSync spun a nested event loop from inside PtyClient::start <- PanePool::createPaneWithId <- TerminalPane Component.onCompleted <- the Repeater that AppModel regenerates on a workspace signal. That loop delivered a QML deferred delete (destroy() is deleteLater) while a sidebar card still had a handler on the stack, and Qt aborts on exactly that. - Pane spawn is now fully asynchronous. DaemonLink::connectAsync() does discovery, process spawn, and the hello/list handshake with timers (spawn poll + handshake watchdog) instead of local event loops, and announces readiness on statusChanged. PtyClient::start() stores the spawn spec and makes the reattach-or-spawn decision when the link reports Ready; a failure surfaces on the new spawnFailed() signal. The spawn callback holds a QPointer and kills the shell when the pane died while the reply was in flight, so no shell leaks in the daemon. - PanePool::connectDaemon() and restartDaemon() are asynchronous too: the restart polls the old daemon pid with a timer, then respawns every pane from the Ready handler. waitForDaemonExit() and ensureConnected() are gone; requestSync() is left for the quit-time batched list only. - SidebarView rebuilds its rows by keyed reconciliation instead of destroying and recreating them all: rows are keyed by workspace id (or family root), reused in place, and only rows that left the layout are destroyed. Cards keep rendering fresh content because their text bindings read the NOTIFY workspaces property through liveWorkspace(). Verified: three and five rapid jj-reseat adds survive (previously fatal); spawn, reattach on relaunch, daemon restart (new daemon, new shell pids), unavailable-daemon and recovery, rename, jj forget, delete, family collapse, mission control, preview streaming, paste, and the add/delete churn path (no leaked shells). ctest 5/5 and static analysis clean.