Refactors tokenizing, adds unit tests, and allows new ECML processing model

The tokenizer now produces a list of token objects, including the text between ECML tags. A prepare hook now allows ECML providers the chance to modify the full token list before the stream replacements are made.

Other alterations: 
 * support for boolean attributes with no value (like "readonly" in HTML)
 * support for escaped quotes inside quoted values. e.g. `name="Joe \"the unknown\" Doe"`
 * allowed `/` in keywords (allows view names and predictable syntax for close tags)

Unit tests for tokenizer & processor.