Solve for constraints when matching interfaces
Solve for constraints when matching interfaces

Previously, we only checked that interface signatures and implementation
signatures were unifiable. This check is actually not sufficient, and
leads to interface typings that are overly permissive. For example, the
interface (a -> a) unifies with everything, even an implementation typed
(Int -> Double) which is patently incorrect.

Solving a basic constraint between the interface an implementation fixes
this issue.

carp-lang/Carp,eriksvedang/Carp,carp-lang/Carp,carp-lang/Carp,eriksvedang/Carp