Theory of Computation: A Primer