GROOVY-6139: Redesign: Lexer-based completion
Refactor ReflectionCompletor class into several smaller completors
Uses Lexer instead of identifying the completion part via string methods
Allows whole-buffer context aware completion
Completes many but not all expressions where statement before dot can
be evaluated without expectable side-effects. Refuses to complete where
completion would require evaluation of e.g. "foo()" or "foo each"
However, it still evaluates operators, getters and "[]" expressions, which might
in some cases perform long-running operations or even have side effects.

Examples that will now complete, but did not before
"foo".
"foo".chars.

Multiline:

x = [1,
2].

y = """start
end""".