A) Primitive Nodes and Node generators, eg. random literal int
generator.
a) Should probably be split according to which type system(s)
they can be imported under.
B) Primitive crossover and mutation operators.
a) Should probably be split according to which type system(s)
they can be imported under.

9) Optimizer.

A) Should be able to take a GP Tree and pre-evaluate everything
possible, eg. (+ 1 2) should be simplified to a single node, 3
if such a node is allowed by the primitives.
B) Should be able to perform full tree reconstruction
optimizations. eg.:
Given the node primitives:
S = \x y z -> ((x z) (y z))
K = \x y -> x
B = \f g x -> (f (g x))
Then:
S (K x) y Simplifies to: B x y
C) Optimizations should be available as mutation operators
that optimize sub-trees. These should not run on every
tree by default as they can cause a premature loss of
good genetic material.