use def to create exceptions instead of val so they aren't needlessly created on each call
simplify environment lookup
use vals and lazy vals in Parser to avoid rebuilding the same parser objects over and over again
fix typo on error message