Apologizing versus asking permission: optimistic concurrency control for abstract data types | Synapse