Functional and Concurrent Programming Principles [Lecture Notes]