Express cardinality constraints in types
Introduce notion of edge traversal anomaly

Suppose we ask for an outgoing edge on a label which indicates
one-to-one but the engine gives us more than one. We'd like to inform
the user somehow, but not just throw an error/exception. We choose to
wrap the output of getEdgesOut/getEdgesIn in the monad Either Anomaly so
that if there is ever an edge cardinality anomaly in a query, the query
is junk.

Moving forward, we might want to implement graph mutations in our
language as well, and provide a guarantee that these label constraints
hold at data commit time. The anomaly notion will still be relevant,
though, since committed data could still be corrupted.
PureGraph.hs example updated
Remove unused import from GraphEngine.hs

One a is now Maybe a to welcome 0 and 1 results. Using Identity was just a
mistake.
EngineEdgeLabel is a data family

Remove AllowAmbiguousTypes extension
PureGraph example uses data family
Correct error in Language.hs adjacentOut/In

Sure, the type system find errors in my program, but who will find
errors in my types ;) ?
Anomaly carries EdgeLabel and Vertex information

I don't understand exactly why, but this demanded that I change the
Vertex type family to a data family. Did the same for Edge, even though
it wasn't strictly necessary; just got a feeling it was right.
PureGraph example updated for data families

Not so trivial...
Anomaly uses existential quantification

The problem: we want Anomaly to carry the edge label and vertex relevant
to the anomaly (edges with given label violate cardinality constraint at
given vertex) but we want multi-hop walks in a graph to produce Either
Anomaly x rather than Either Anomaly (Either Anomaly ( ... (Either
Anomaly x) ... )) which would be necessary if we used universal
quantification because, well, what would be the type of the multi-hop
walk?

  Either (Anomaly ? (Vertex m)) (m a)

With existential quantification, we can just throw any edge label onto
an anomaly, and all the user can do is show it.
Add EdgeLabel constraint to getEdgesOut/In
Minor: remove whitespace
Massive redesign and refactor

I honestly can't remember all of the changes over the past few days.
Clarify Edge cardinality type families
Added example GraphOfTheGods
Merge pull request #1 from avieth/aovieth/edge_cardinality/base

Type-level representation of edge cardinality constraints