This allows us to get accurate mappings for columns as well, which is
required for column breakpoints to work.
To mitigate the performance regression we'd get from adding many more mappings,
instead of using a SourceNode, then adding children to it, and at the end add
all the mapping in a SourceMapGenerator, we directly use the SourceMapGenerator
in the write function.
This means that we need to compute the pretty-printed code ourselves, but it's
easy to borrow the logic in toStringWithSourceMap.
We also only add mappings in the SourceMapGenerator for tokens (and not for
whitespaces), as it reduces the amount of elements we have to go through, while
still producing a valid source map in the end.
By doing that, we can also invert the mapping directly in write, so we don't
have to do it later in the worker code, and avoid having to re-sort the mappings
array.
A test is added to ensure column breakpoints work as expected after pretty-printing