This enables handling of queries like workspaceSymbols by the last used
external index, which might be null when the query comes from a file specific
context but that file doesn't have any ExternalIndex set (existing behaviour).
This also moves config::Params into Config, rather than just having a file path
inside the Config struct or deducing the environment from Context.
who owns the underlying string, with what lifetime?
The "root" that creates the config doesn't currently have any obligation to keep the params around for as long as the config might be active (which can be async via context). I think in config this should be a std::string