The API provided by refactoring lib doesn't provide enough flexibility
to get clangd's rename to behave as we expect. Instead, we replace it
with the low-level rename functions, which give us more control.
Bonus:
- performance, previously we visit the TU to find all occurrences, now we just visit top-level decls from main file;
- fix a bug where we wrongly filter out the main file replacement due to the different relative/absolute file path;