Communicating Transactions: A Programming Abstraction for the Multicore Era