support for (co/contra)variant generics

Summary: Generics in Hack are invariant by default. What that means is that if
a function takes a X<A> it cannot be used with an X<B> (where A is subtype of B).
There are quite a few programming languages that allow this (they use different notations: in/out, +/- or ? extends).
Some others choose to just be covariant everywhere and be unsound (dart, typescript).

I pushed back on that feature because it's complicated, and I seriously doubt that most programmers understand it.
However, we have deep class hierarchies to deal with, that leads to complex subtyping relations and it makes
generics painful to use.
We have gotten to the point where we periodically modify the type-checker to hard-code the name of a class
that should be covariant ...

Because of that: Here comes covariant support for Hack!

Reviewed By: @elgenie

Differential Revision: D1445708