sparts.thrift.compiler: compile .thrift files on the fly

This change adds some new functionality to sparts: the ability to
compile .thrift files into python modules more directly.  This can be done
with the compile() function in `sparts.thrift.compiler`.   compile()
returns a dynamically-generated module object, which contains all of the
attributes of the ttypes.py and constants.py files, as well as all
declared thrift `service`s as attributes on the file.

For example, if foo.thrift contains `service FooService {...}`, a
thrift client can be generated totally on the fly in this way:

  from sparts.thrift import compiler, client

  foo = compiler.compile('foo.thrift')
  foo_client = client.ThriftClient(module=foo.FooService, ...)

It even supports inheritance (E.g., `service Foo extends FB303 {...}`),
Since dependent modules are generated and cached in a way that makes
them easier to import, this should make it easier to define your own
services that extend some common base functionality.