Create batch versions of query environment methods getFwdDeps and getReverseDeps, and migrate DepsFunction and RdepsFunction to use them.

This makes our (unordered) results potentially dependent on the iteration order of hash sets, but what do we care?

--
MOS_MIGRATED_REVID=96117626
diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
index d76a45e..6129c64 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
@@ -167,6 +167,15 @@
   }
 
   @Override
+  public Collection<Target> getFwdDeps(Iterable<Target> targets) {
+    Set<Target> result = new HashSet<>();
+    for (Target target : targets) {
+      result.addAll(getFwdDeps(target));
+    }
+    return result;
+  }
+
+  @Override
   public Collection<Target> getReverseDeps(final Target target) {
     return Collections2.filter(getRawReverseDeps(target), new Predicate<Target>() {
       @Override
@@ -178,6 +187,15 @@
   }
 
   @Override
+  public Collection<Target> getReverseDeps(Iterable<Target> targets) {
+    Set<Target> result = new HashSet<>();
+    for (Target target : targets) {
+      result.addAll(getReverseDeps(target));
+    }
+    return result;
+  }
+
+  @Override
   public Set<Target> getTransitiveClosure(Set<Target> targets) {
     Set<Target> visited = new HashSet<>();
     List<Target> result = new ArrayList<>(targets);