Covariance fixes

Summary: This diff updates the typechecker to support covariance for the following
interfaces: Traversable, Container, Iterable, Iterator, ConstCollection,
KeyedTraversable, KeyedContainer, Indexish, KeyedIterable, KeyedIterator.

This diff also two bugs with covariance. First, it fixes the logic for
checking if array<..> is a subtype of Indexish<..>, Traversable<..>,
KeyedTraversable<..>, Container<..>, or KeyedContainer<..>. Second, it
fixes a bug in the covariance logic that was erroneously allowing certain
subtype relationships (for example, it was allowing a Pair to be passed to
a function expecting an ImmMap).

Reviewed By: @jwatzman

Differential Revision: D1511248
Make Set implement KeyedIterable and support bracket syntax for reading

Summary: Over time, Sets have slowly been moving towards supporting more key-based
operations (ex."array_diff_key(..)", "foreach ($set as $k => $v) {..}",
etc) to make collection adoption easier and to make things more convenient.
Likewise, Set->array was changed a while ago so that each value in the Set
is inserted into the array as both the key and value (to make interop
smoother between arrays and collections).

This diff takes another step in this direction by making Set to implement
KeyedIterable, by making Sets support bracket syntax for reading and
unsetting elements, and by making idx() work with Sets. This makes things
more consistent than the current state of affairs, and it also makes
migration easier by enabling things like "isset($set[$x])" to check if a
value is present in the Set. It also positions us better to eventually
merge Iterable and KeyedIterable into a single interface, which I think
would be a good way of simplifying the number of interfaces in the
Collections framework (same goes for Traversable / KeyedTraversable,
Iterator / KeyedIterator, and Container / KeyedContainer).

Care is taken to prevent the use of "$set[$x]" syntax to overwrite an
element or modify an element in place for Sets.

For now, Set does not implement ConstIndexAccess or Indexish. Making Set
implement these interfaces in the future might make sense, but I'd like to
punt on the decision for now.

Reviewed By: @elgenie

Differential Revision: D1435557