Redefined Lexer.Read in terms of Lexer.Peek

- The lexer now defines Read() in terms of Peek() so that Peek() doesn't
have to undo Read()'s changes any more.
- A previously Peek()'d symbol can now be Read() after the fact with the
new Commit() overload.
- Rewind() no longer needed; removed.
Added Parser class

- Added the Parser class to construct TagData structs from the Lexer.
- Changed TagData to store a Lexer instead of a TagReader.
Added StaticName to TextTag

- EofTag got a StaticName because it was used statically. TextTag's name
is also used statically, so it now has its own StaticName.
Removed Offset member from TagData

- File offsets aren't provided by the lexer, so TagData can't provide
them anyway.
Fixed Parser to detect end-of-file

- The parser now detects the end of the file when reading from the
lexer.
Made parser throw on malformed tags

- The parser would happily return a tag if the right cap was missing.
The error would turn up later when Raindrop reported that it couldn't
build a "<:data something /> is my favorite thing ever!..." tag. Now it
reports the missing cap instead.
Removed redundant classes

- Removed DelimiterReader
- Removed FarPeekTextReader
- Removed InfoProvidingTextReader
- Removed TagReader

These class' functionality is all handled by the Lexer now, except for
the Unescape function in TagReader, which will be moved somewhere else.
Added method summaries

- Added summaries to methods in the Lexer and Parser classes.
Comment change
- Renamed StartsWith() to SubstringAt()

- SubstringAt seems like a more appropriate name than StartsWith since
it doesn't actually test if the string *starts* with the substring.
Refactored SubstringIsAt()

- Renamed index -> startIndex for consistency with other string methods
- Used built-in IndexOf() method to simplify code.
Added missing newline convention to CurrentLine()
Made Parser and Lexer public
Made Symbol public
Removed unneeded use of LexerNS
Pruned unneeded initialization

TagStruct no longer has an Offset member, so initializing it in the
parser isn't needed any more.
Added dedicated template class

Passing around a lexer seemed somewhat strange. Passing a template makes
more sense.
Gave template class functionality

The template class is now responsible for handling state:
- Line counts
- File offsets
Removed increment methods from template

The IncNewline and IncCarriageReturn methods weren't being used because
their functionality was redundant with with just updating the index.
Changed TagData to store a template

Lexer no longer stores state, Template does.