The Language of Machines: An Introduction to Computability and Formal Languages