Python: Add support for PEP-758 exception syntax
This PR is stacked on top of #20708, so that one should be reviewed first.
See https://peps.python.org/pep-0758/ for more details.
We implement this by extending the syntax for exceptions and exception groups so that the type field can now contain either an expression (which matches the old behaviour), or a comma-separated list of at least two elements (representing the new behaviour).
We model the latter case using a new node type exception_list, which in tsg-python is simply mapped to a tuple. This means it matches the existing behaviour (when the tuple is surrounded by parentheses) exactly, hence we don't need to change any other code.
As a consequence of this, however, we cannot directly parse the Python 2.7 syntax except Foo, e: ... as except Foo as e: ..., as this would introduce an ambiguity in the grammar. Thus, we have removed support for the (deprecated) 2.7-style syntax, and only allow as to indicate binding of the exception. The syntax except Foo, e: ... continues to be parsed (in particular, it's not suddenly a syntax error), but it will be parsed as if it were except (Foo, e): ..., which may not give the correct results.
In principle we could extend the QL libraries to account for this case (specifically when analysing Python 2 code). In practice, however, I expect this to have a minor impact on results, and not worth the additional investment at this time.