parser rewrite for correctness

Summary:
 - added tests
 - added wrapper around the python tokenizer to manage rewinding and retokenizing in the middle of the stream
 - switched to a modified version of python's tokenize module that's a little more forgiving about EOF and unexpected dedents
 - wrote a dumb HTML parser from the spec, with additional support for shoving python tokens inside attributes
 - watch for '{' as we're feeding tokens to the HTML parser; when we see one, recurse, recurse!

Note that this change is BACKWARDS INCOMPATIBLE. Primarily, we no longer
support \ as an escape character. There are others changes to edge cases
involving whitespace.

Test Plan:
Greatly expanded test suite

Compared with existing behaviour on the dropbox codebase. There are some differences, but I'm pretty sure they are all features, not bugs.

      ack --python "#\s*coding\s*[=:]\s*pyxl\s*$" -l > ~/pyxl_files.txt
      # check out old pyxl
      for file in `cat ~/pyxl_files.txt` ; do echo $file ; genfile=$file.old_pyxl ; parse_file.py $file > $genfile ; ~/normalize_pyxl_output.sh < $genfile > $genfile.norm ; done
      # check out new pyxl
      for file in `cat ~/pyxl_files.txt` ; do echo $file ; genfile=$file.new_pyxl ; parse_file.py $file > $genfile ; ~/normalize_pyxl_output.sh < $genfile > $genfile.norm ; done

      for file in `cat ~/pyxl_files.txt` ; do diff -u -b $file.old_pyxl.norm $file.new_pyxl.norm ; done > ~/pyxl.diff

      for file in `cat ~/pyxl_files.txt` ; do [[ `cat $file | wc -l` == `cat $file.new_pyxl | wc -l` ]] || (echo NOT OK ; wc -l $file{,.new_pyxl,.old_pyxl}) ; done

normalize_pyxl_output.sh contains:

      sed -e '1,2{/coding.*pyxl/d}' |          # strip coding line (decoded already)
      ~/pythontidy.py |
      sed -e '/^$/d'                           # strip empty lines

Reviewers: prha
Add form autocomplete attribute
Add meta charset attribute
Add RSS support to pyxl.
This creates a pyxl element for <form:error />
Use numpy to generate random numbers faster.

in my test numpy took 2.5s to generate 10mil random numbers and pycrypto
random took 12s.
add <else> tag
Add line/col numbers to pyxl exceptions

Python swallows these and says "encoding problem: with BOM" instead, but
hopefully we can expose these usefully someday.
add enum support for pyxl attribute values

we can pass in tuples now instead of plain old types
Add figure and figcaption
Add iframe sandbox attribute
Add <main> element