Types and Programming Languages notes and exercises