Programming Concurrency on the JVM: Mastering Synchronization, STM, and Actors