We adopt the convention that zero-based UTF-16 positions as sent by LSP clients
are represented by Lsp.Position while internally we mostly use String.Pos UTF-8
offsets. For diagnostics, one-based Lean.Positions are used internally.
character is accepted liberally: actual character := min(line length, character)