Enforcing high-level protocols in low-level software | Synapse