Concurrency is omnipresent in modern software development. Even small applications often run on systems with multiple cores, interact with databases, wait for network responses, or share resources ...