Introduce custom errors for lexing
Created by: ecoulson
Summary
Introduced custom errors for lexing and for the char reader. These changes were made to make the methods of these structs more readable since the ?
operator could be used. This PR also removes brittle unit tests that check every keyword, punctuation, and operator.