Refactor spike in a better shape

* Add distinct base classes for transformers and predicates
* Add mixins for nary, nullary, and parameterized transformers /
  predicates
* Add more docs
* Improve pretty printer internals and usage a lot.