Metacognition and Self-Regulation in Programming Education: Theories and Exemplars of Use