Designing Tools and Curricula for Undergraduate Courses in Distributed Systems