Type system does not honor covariance and contravariance for IsAssignableFrom().

Given the following type definitions:

````
private interface I
{
}

private interface I<out T> : I
{
}

private class C<T> : I<T>
{
}
````

The following assignments are all valid:

````
I<string> i1 = null;
I<object> i2 = i1;
C<object> c1 = null;
i2 = c1;
C<string> c2 = null;
i2 = c2;
I i = i1;
i = i2;
````

Therefore, b1, b2, b3, b4, and b5 should all be true:

````
bool b1 = typeof(I<object>).IsAssignableFrom(typeof(I<string>));
bool b2 = typeof(I<object>).IsAssignableFrom(typeof(C<object>));
bool b3 = typeof(I<object>).IsAssignableFrom(typeof(C<string>));
bool b4 = typeof(I).IsAssignableFrom(typeof(I<string>));
bool b5 = typeof(I).IsAssignableFrom(typeof(I<object>));
````

However, b1 and b3 are false because they aren't taking into account that I is covariant on generic type parameter T.