This replaces the C++ IPC compiler and generator with a python3 port.
For validation, the parser is nearly a line-for-line port of the C++
parser. This patch includes lexer.py, which is a simple port of our
GenericLexer, as the mechanics actually felt pretty nice in python as
well.
The code generator does not include a port of our SourceGenerator, as
that felt less nice. Instead, we write directly to a TextIO instance.
The generated output is almost byte-for-byte identical with our C++
generator, with trivial whitespace differences:
* The C++ generator included extraneous newlines before and after all
switch statements, which is not kept here.
* The C++ generator did not include newlines between message handling
functions, which we now do.
* The C++ generator had some extraneous spaces at the end of some lines,
and incorrect tabbing (3 spaces) at the beginning of some lines.