Fixed #23867 -- removed DateQuerySet hacks

Removed DateQuerySet and all related classes to it. Previously Django used a Compiler subclass to implement value conversions for DateQuerySets. Now with the new expressions and converters APIs this isn't necessary any more. We can just use plain queryset methods and an expression to implement what we want.

The code now calls expression.get_db_converters(), where it applied blindly expression.convert_value before. The biggest problem currently is that expression.get_db_converters() is called *after* database's get_converters method. The comments in the code say that the expression.convert_value should  be called first. I believe I need to make some more changes here before the build passes.
Consider using hanging indentation style, so that lines can be longer:
```
raise ValueError(
    "Database returned an invalid value in QuerySet.datetimes(). "
    "Are time zone definitions for your database and pytz installed?"
)
```