Move gclient path access to separate module.

gclient_utils.py is a kitchen sink and is for that reason expensive
to import. Move the comparatively cheap and simple path routines
to a new gclient_paths module and use that in gn.py, clang_format.py,
dart_format.py.

(To be able to move FindGclientRoot() to gclient_paths.py,
make it use io.open() instead of FileRead(). FileRead() tries
to paper over invalid utf-8, but that was added for presubmits,
not for .gclient files, so this is hopefully fine.)

Cuts gn.py overhead in half (on my Windows laptop from 0.6s to 0.25s,
still high; on my Mac laptop from 0.1s to 0.05s), and probably helps
the other two too.

Completely remove PathDifference() since it's unused.

Bug: 939959
Change-Id: I6a70f6e4c16062b622fb2df8778e8a598d4cc956
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/1512058
Commit-Queue: Nico Weber <thakis@chromium.org>
Reviewed-by: Andrii Shyshkalov <tandrii@chromium.org>
diff --git a/dart_format.py b/dart_format.py
index ee07efe..ae85602 100755
--- a/dart_format.py
+++ b/dart_format.py
@@ -14,7 +14,7 @@
 import subprocess
 import sys
 
-import gclient_utils
+import gclient_paths
 
 class NotFoundError(Exception):
   """A file could not be found."""
@@ -26,7 +26,7 @@
 
 def FindDartFmtToolInChromiumTree():
   """Return a path to the dartfmt executable, or die trying."""
-  primary_solution_path = gclient_utils.GetPrimarySolutionPath()
+  primary_solution_path = gclient_paths.GetPrimarySolutionPath()
   if not primary_solution_path:
     raise NotFoundError(
         'Could not find checkout in any parent of the current path.')