When `x` is null, the result of this expression must be `z`. Because of
incorrect lowering of the `or?` operator to abstract expressions, the
left operand (`x?.y`) was considered as a prefix, and so the whole
expression returned null when any prefix in `x?.y` (thus `x` included)
was null.
The `or?` operator has no prefix, since it does not use dot notation, so
its lowering must not create a prefix.
Transition all relevant testcases to it. In the process, port
docstrings/comments from test.py files to expected_concrete_syntax.lkt
(now test.lkt) sources and fix stylechecks issues there.
This makes the convention consistent with the DSL, and avoids
workarounds for conflicts with Lkt keywords: in Libadalang, the Null
token can stay Null, instead of null_tok (no API breakage needed).
Completely rework the expansion of expressions to account for
null-conditional operations: for instance, compile `a?.b.c` as
`a.then(a => a.b.c)` instead of the current `a.then(a => a.b).c`.