runProtocol
suspend fun runProtocol(id: String, label: String, block: suspend ProtocolScope.() -> Unit): ProtocolResult
Run a durable, idempotent multi-step protocol saga as ONE foreground operation (#253). Each ProtocolScope.step is skipped when its doneWhen is already true on-ledger, so re-running id (after process death, or on app resume) resumes from the first not-done step with no double-submit — the chain is the journal. The inner contract.calls coalesce under this op, so it reads as ONE operation + one finalization push. label drives the notification.
Returns ProtocolResult.Completed when every step finished, or ProtocolResult.AwaitingCounterparty when the saga hit an unsatisfied ProtocolScope.awaitCounterparty (the foreground service is released; re-run to resume once the counterparty acts).