Renamed Lexer namespace to LexerNS

- The Lexer namespace was renamed to LexerNS to get rid of conflicts
with the new Lexer class until the namespace is removed.
Updated use of Lexer namespace to use LexerNS
Added Punctuation class

- The Punctuation class contains all the punctuation characters in a
central place, which is necessary because the lexer and parser both need
to access them.
Fixed comment

- Changed term token -> symbol in lexer file comment.
Renamed file ITag -> ITagBuilder

- The ITag file's name didn't match the contained class. Now it does.
Refactored punctuation out of Lexer

- The lexer should no longer be aware of exactly what punctuation is
used.
- A new String.StartsWith overload was added to the Punctuation class
that accepts an index to start searching at, to help the lexer do its
job.
String.StartsWith overload moved to Lexer

- Only the lexer needs the special String.StartsWith overload. It makes
more sense to keep the overload with the class that needs it.
Fixed Lexer reporting wrong end of symbol
Added Peak functionality to lexer

- The lexer can now peek at the next symbol in the source without
reading it.
- Lexer variables are now explicitly initialized instead of relying on
implicit defaults that could eventually change.
- Exception to above: lookahead. This won't be accessed until
lookaheadSet is set, and that's only set *after* lookahead is
initialized, so it shouldn't be an issue.