This PR attempts to handle implicits in a more principled manner. We want to be able to ensure that:
fix : { a : Type } -> { b : Type } -> ((a -> b) -> a -> b) -> a -> b
fix = \ {a} {b} f . f (fix {a} {b} f)
≡
fix : { a : ? } -> { b : ? } -> ((a -> b) -> a -> b) -> a -> b
fix = \ {a} {b} f . f (fix {?} {?} f)
≡
fix : ((a -> b) -> a -> b) -> a -> b
fix = \ f . f (fix f)
This PR attempts to handle implicits in a more principled manner. We want to be able to ensure that: