Cleans up occurs check/equation substitution
Moar hlint suggestions
Convert unification failure mode to `Either`

* Now we can see what went wrong without hax!
Adds example for failing inference

* This will let us test out converting the inference failover to `Either` as
  well.
Inference now uses `Either` for failure too