Pass the source path -> Artifact mapping into FdoSupport from a provider instead of special-casing it.

This removes the need to deserialize artifacts in FdoSupport, which in turn removes the need to support artifact deserialization at all, which makes our lives simpler and Thoreauvian programming is good.

--
MOS_MIGRATED_REVID=115660698
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
index 9d1c291..5c69ce5 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
@@ -155,8 +155,7 @@
   private final Root root;
   private final PathFragment execPath;
   private final PathFragment rootRelativePath;
-  // Non-final only for use when dealing with deserialized artifacts.
-  private ArtifactOwner owner;
+  private final ArtifactOwner owner;
 
   /**
    * Constructs an artifact for the specified path, root and execPath. The root must be an ancestor
@@ -291,27 +290,12 @@
    * ArtifactOwner#NULL_OWNER} or a dummy owner set in tests. Such a dummy value should only occur
    * for source artifacts if created without specifying the owner, or for special derived artifacts,
    * such as target completion middleman artifacts, build info artifacts, and the like.
-   *
-   * <p>When deserializing artifacts we end up with a dummy owner. In that case,
-   * it must be set using {@link #setArtifactOwner} before this method is called.
    */
   public final ArtifactOwner getArtifactOwner() {
-    Preconditions.checkState(owner != DESERIALIZED_MARKER_OWNER, this);
     return owner;
   }
 
   /**
-   * Sets the artifact owner of this artifact. Should only be called for artifacts that were created
-   * through deserialization, and so their owner was unknown at the time of creation.
-   */
-  public final void setArtifactOwner(ArtifactOwner owner) {
-    if (this.owner == DESERIALIZED_MARKER_OWNER) {
-      // We tolerate multiple calls of this method to accommodate shared actions.
-      this.owner = Preconditions.checkNotNull(owner, this);
-    }
-  }
-
-  /**
    * Returns the root beneath which this Artifact resides, if any. This may be one of the
    * package-path entries (for source Artifacts), or one of the bin, genfiles or includes dirs
    * (for derived Artifacts). It will always be an ancestor of getPath().
@@ -807,12 +791,6 @@
   }
 
 
-  static final ArtifactOwner DESERIALIZED_MARKER_OWNER = new ArtifactOwner() {
-    @Override
-    public Label getLabel() {
-      return null;
-    }};
-
   @Override
   public boolean isImmutable() {
     return true;