[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 believe it's going to be a problem and we'll get tickets about unexpected behavior. In admin and forms, for example, when updating or creating an object, there's no automatic way to have empty strings converted to null. If we decide not to change the behavior, I'll be happy to add a warning.