* InferTypes: Fix an abusive generalization of type variables. It
  was meant to handle programs like this:

let external ['a] (read : unit -> 'a) = "fun () -> input_value stdin"
let external ['a] (write : 'a -> unit) = "fun x -> output_value stdout x"
let echo = fun (x: unit) -> write (read ())

  But this abusive generalization triggerred several incorrect behaviors
  on other programs. For instance:

let external ['a] (read : unit -> 'a) = "fun () -> input_value stdin"
let external ['a] (write : 'a -> unit) = "fun x -> output_value stdout x"
let echo = fun (x: unit) -> write (read ())
let main = echo ()

  was rejected because it was impossible to find a type to instantiate
  echo.