setDraftMessage
Updates the in-memory draft immediately; the durable writes are debounced by DRAFT_PERSISTENCE_DELAY_MS, so rapid edits cancel the prior pending flush and only the trailing value persists. On process death within that window the last ≤DRAFT_PERSISTENCE_DELAY_MS of typing is not durably saved — a conscious trade-off to avoid per-keystroke jank.
No-ops while draftMessage is still null, so the composer's initial empty value cannot erase a stored draft before it has been read back.