[WIP] Fixed #23753 -- Added a suite of SQL Functions

This is a work in progress, but not too far off being code complete. I thought it was better to open a PR rather than have people try to track individual commits on my fork.

A few notes at this point in time:

- ~~I plan on renaming Concat to ConcatPair (name TBD), and renaming ConcatMany to Concat.~~
- Some backends allow an arbitrary number of args to Concat, but I've chosen implementation simplicity by implementing multi-concat the same across all backends. If performance differences can be shown, I'll revisit this choice.
- ~~Some functions validate args in init, others in resolve expression. I think I'll standardise on init, since objects should be fairly complete on instantiation.~~
- I won't be implementing Case/When just yet. Michal on the ML has a better implementation than the one I had prototyped, and I'll let Michal finish and submit a PR for that part.
- ~~Tests are basic and should probably cover a lot more failure states.~~
- ~~Docs. They'll come last as always.~~

Are we happy about the namespacing? Is `models.functions.*` an OK place?
I'm not too happy adding a converter here, but it makes the tests pass. For some reason, `Concat(char_field, text_field)` is returning `bytes` rather than `text`. Looking briefly at the database driver, it appears that `longtext/BLOB` is defined as returning `bytes`. I'm not sure how django manages to force model fields defined as TextFields into text, but the same (or similar) will need to apply to expressions using TextFields.

If someone can point me in the right direction I'd be thankful. But for the moment, this is all I've been able to manage.