[Core] Improved performance of ProjectFileCollection's GetFile(s) methods

By maintaining a tree structure internally of ProjectFile nodes based on
their VirtualProjectPath's, we can quickly and efficiently lookup
ProjectFiles based on a given VirtualProjectPath. We can also quickly
and efficiently get all ProjectFiles within a folder with a particular
VirtualProjectPath.

Also maintains a Dictionary for fast lookups of ProjectFiles based on
their real paths.

These 2 optimizations cover most of the use cases for ProjectFile lookups
in use by MonoDevelop currently.