Make DataType covariant

Summary: We want to beable to have `MyThingDataType::at()->impl()` be typed as `MyThingDataType` while having `MyThingDataType::at()` typed as `DataType<Tk, Tv>`.
The solution is to pass `this` out of `::at` so that the return type is `DataType<Tk, Tv, this>`. This allows `impl()` to return the base class. In order to do this I need `DataType` and `DataTypeImplProvider` to be covariant. This diff hacks hack to think they are until we have a better solution.

Reviewed By: @jwatzman

Differential Revision: D1515044