@neuroevolutus plumbed source information through to AST nodes. Now we should be able to report interpreter and compiler errors more neatly.
I think we should have some kind of API like report_error_from(astnode, ...) that raises an exception and a separate API that catches that exception and formats an error neatly using spans (kind of like ariadne or the CPython traceback module). The exception-catcher probably has the source text still available so we don't need to plumb that through the various SourceExtents along the way.