Programming Languages and Operational Semantics: An Introduction