* 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.
* For the moment, only the elaboration phase was checking that
  value restriction was respected. Now, we make type inference
  aware of value restriction in order to accept some extra programs
  like:

  let id = fun x -> x
  let id2 = id id
  let main = id2 0
Merge upstream.