Describir: Principles of concurrent and distributed programming