Elements of Distributed Computing