Improve GetFileName() algorithm:

Before, when looking for the declaration file /A/B/C/D.h, any file called D.h that is reachable through an include search path would have been found.

This is improved by first looking for A/B/C/D.h (within any search path), then B/C/D.h etc, until found. This is the "long version" of the header file name.

Then the reverse pass happens: D.h, then C/D.h etc is searched for, and if found its FileEntry is identical to the FileEntry of the long version it will be returned.

This allows to find the most specific version of the file (B/C/D.h), but its shortest include name resulting in the inclusion of the same file (C/D.h).
Handle =default/delete. Be more verbose in assert. Use isImplicit()