Teaching Distributed Computing at Undergraduate Level