[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?
Nope, running each inner converter isn't the way to go either, because subexpressions do not imply the output of the entire expression:

```
Length(Concat('char', 'text'))
```

If it was to use inner converters, it would first attempt to coerce the value to text (the Concat converter), and then attempt to convert *that* into an int (if the Length actually had a converter, which it doesn't).

The only two options I can think of are:

1. Add a backend converter like this patch has already done; or
2. Track down the cause of the bug, and fix it at the driver level.

I'll look into 2 more carefully, and hopefully I can come up with something.