This makes type checking more directed, and somewhat more predictable.
On the downside, it makes it impossible to declare the singleton on
lists as an instance of SingletonM and the insert and alter operations
on functions as instances of Alter and Insert. However, these were not
used often anyway.

This way, it won't pick arbitrary (and possibly wrong!) inG instances
when multiple ones are available. We achieve this by declaring:
Hint Mode inG - - +
So that type class inference only succeeds when the type of the ghost
variable does not include any evars.
This required me to make some minor changes throughout the whole
development making some types explicit.