When modifiable framework instances are in fact modified, ensure that superclass implementations get the correct provider instance during initialization.

DelegateFactory is used to solve this cycle (though not a binding cycle, it is a "codegen" cycle of sorts), and a DelegateProducer is added for the same purpose but for producers.

In order for the delegate factories to be initialized properly, initialization is moved out of the constructors of abstract subcomponent implementations and into a method that can be called after super(); calls in the final implementation.

This is a rollforward of 218dd448dfd1d791480f13e507eed567fdabae43, which relied on Guava's functional types extending the java.util.function types (which continue to bite us in bizarre ways). I've verified that the broken targets now build

RELNOTES=n/a

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=221828464
diff --git a/java/dagger/internal/codegen/CodeBlocks.java b/java/dagger/internal/codegen/CodeBlocks.java
index bc8fccd..c1ca32d 100644
--- a/java/dagger/internal/codegen/CodeBlocks.java
+++ b/java/dagger/internal/codegen/CodeBlocks.java
@@ -28,6 +28,7 @@
 import com.squareup.javapoet.ClassName;
 import com.squareup.javapoet.CodeBlock;
 import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.ParameterSpec;
 import com.squareup.javapoet.TypeName;
 import java.util.stream.Collector;
 import javax.lang.model.element.ExecutableElement;
@@ -56,6 +57,17 @@
   }
 
   /**
+   * Returns a comma-separated {@link CodeBlock} using the name of every parameter in {@code
+   * parameters}.
+   */
+  static CodeBlock parameterNames(Iterable<ParameterSpec> parameters) {
+    // TODO(ronshapiro): Add DaggerStreams.stream(Iterable)
+    return stream(parameters.spliterator(), false)
+        .map(p -> CodeBlock.of("$N", p))
+        .collect(toParametersCodeBlock());
+  }
+
+  /**
    * Returns one unified {@link CodeBlock} which joins each item in {@code codeBlocks} with a
    * newline.
    */