update App Data
Set the group's opaque appData.
expectedAppData is an optional compare-and-swap guard. When provided, the update is abandoned — rather than overwriting — if the committed value is no longer that, including when another member's commit wins the race after this update was published. Callers reconciling structured state should pass the value they merged against, so a concurrent write surfaces as an error instead of silently discarding someone else's change. Omit it for last-writer-wins.