Principles of Concurrent and Distributed Programming (2nd Edition)