Reland "gclient: Add commands to edit dependencies and variables in DEPS"

This is a reland of 7f4c905fc53e7cbcc3277074c6a339ade8bc0f66

Original change's description:
> gclient: Add commands to edit dependencies and variables in DEPS
> 
> Adds 'gclient setvar' and 'gclient setdep' commands to edit variables
> and dependencies in a DEPS file.
> 
> Bug: 760633
> Change-Id: I6c0712cc079dbbbaee6541b7eda71f4b4813b77b
> Reviewed-on: https://chromium-review.googlesource.com/950405
> Commit-Queue: Edward Lesmes <ehmaldonado@chromium.org>
> Reviewed-by: Aaron Gable <agable@chromium.org>

Bug: 760633
Change-Id: Ia46c74d02e5cc3b67517dfa248f597cb3d98ef3d
Reviewed-on: https://chromium-review.googlesource.com/969457
Commit-Queue: Edward Lesmes <ehmaldonado@chromium.org>
Reviewed-by: Aaron Gable <agable@chromium.org>
diff --git a/gclient_utils.py b/gclient_utils.py
index b679169..81bed14 100644
--- a/gclient_utils.py
+++ b/gclient_utils.py
@@ -1278,7 +1278,7 @@
 
   Will raise TypeError if you pass an object which is not hashable.
   """
-  if isinstance(obj, dict):
+  if isinstance(obj, collections.Mapping):
     return FrozenDict((freeze(k), freeze(v)) for k, v in obj.iteritems())
   elif isinstance(obj, (list, tuple)):
     return tuple(freeze(i) for i in obj)