awaitCounterparty
Boundary for an UNBOUNDED wait on a counterparty (e.g. the opponent's move). No foreground service may span it, so if doneWhen isn't yet true the engine ENDS this segment — releasing the foreground service — and the saga resumes (re-run via MidnightSdk.runProtocol with the same id) when the counterparty acts. Ledger- anchored doneWhens carry the resumed run forward past the already-done steps.