An Introduction to Error-Correcting Codes: From Classical to Quantum