Basic species expression AST

A basic, untyped AST type for species expressions, for easily
doing things like analysis, simplification, deriving isomorphisms,
and so on. Converting between SpeciesAST and the typed variant
ESpeciesAST can be done with annotate and erase.

Typed, sized species expression AST

A variant of SpeciesAST with a phantom type parameter which
also reflects the structure, so we can write
quasi-dependently-typed functions over species, in particular for
species enumeration.

Of course, the non-uniform type parameter means that
TSpeciesAST cannot be an instance of the Species class; for
that purpose the existential wrapper ESpeciesAST is provided.

TSpeciesAST is defined via mutual recursion with
SizedSpeciesAST, which pairs a TSpeciesAST with an interval
annotation indicating (a conservative approximation of) the label
set sizes for which the species actually yields any structures;
this information makes enumeration faster and also prevents it
from getting stuck in infinite recursion in some cases. A value
of SizedSpeciesAST is thus an annotated species expression tree
with interval annotations at every node.

ASTFunctor class (codes for higher-order functors)

ASTFunctor is a type class for codes which can be interpreted
(via the Interp type family) as higher-order functors over
species expressions. The apply method allows such codes to be
applied to a species AST. The indirection is needed to implement
recursive species.

Miscellaneous AST operations

needsCI is a predicate which checks whether a species expression
uses any of the operations which are not supported directly by
ordinary generating functions (composition, differentiation,
cartesian product, and functor composition), and hence need cycle
index series.