Summary: Types and related functions for the representation used in EMGM.

EMGM uses a generic sum-of-products view of datatypes encoded into the
Unit, :+: (sum), and :*: (product). Many Haskell datatypes can be
represented in this way. Right-nested sums replace the |, and right-nested
products replace the arguments to a constructor. Units replace constructors
with no arguments.

Since constructors encode more than just a list of arguments, this library
uses ConDescr to store that information. This includes name, arity, record
labels, fixity, and operator precedence. Constructor descriptions are useful
for generic operations such as Read and Show and possibly others.

Generic functions need to convert values between the Haskell datatype and its
structure representation. This is done using the embedding-projection pair,
which is simply a pair a functions for translating between two types.

Embedding-Projection Pair

The embedding-projection pair contains two functions for converting between
the datatype and its representation. An EP value preserves an isomorphism
(ignoring _|_s) between a datatype and its structure representation.