Type Inferencing (Algorithm W)

- Construct the representations of Ty_hm, TyScheme_hm, TyVar, TyEnv_hm  DONE

- Construct the function (TyScheme_hm -> TyVar) and (TyEnv_hm -> TyVar)  DONE

- Implement the functions gen and inst (see slides)  DONE?????

- Create the oracle for fresh variables

- Implement algorithm W
- Create an syn attr that will create the System F version for every subterm
    based on the result of algorithm W.
    If one of the subterms results in fail when applying W to it,
    the entire construction will fail


BUGS:

1) Wrong type (a1 -> a1) in test/t5

2) Stack overflow (infinite recursion) in test/t6
