Principles of concurrent and distributed programming | Synapse