cpp: don't use pathological regexes everywhere :\

Fixes #73.  If there was a sequence of multiline comments and whitespace
followed by something other than a macro, the lexer would scan the entire
sequence n times, causing it to blow up quadratically.  This way it just
keeps track of whether it's at the beginning of the line using a lexer
state, so it only ever scans one comment at a time.