features as outer keys

This allows us to take advantage of sparseness and avoid dict lookup
misses. A number of changes follow from this.

Numeric types are now located in `ppntypes.py`
Further debugging, optimization, and style
trailing whitespace