code: @Value.Lazy
    public NameForms typeValue() {
      if (protoclass().kind().isValue()) {
        return returnsAbstractValueType()
            ? typeAbstract()
            : typeImmutable();
      }
      if (isFactory()) {
  
        if (protoclass().kind().isConstructor()) {
          TypeElement enclosingType = (TypeElement) protoclass().sourceElement().getEnclosingElement();
  
          return ImmutableConstitution.NameForms.builder()
              .simple(enclosingType.getSimpleName().toString())
              .relativeRaw(enclosingType.getQualifiedName().toString())
              .genericArgs(generics().args())
              .relativeAlreadyQualified(true)
              .packageOf(NA_ERROR)
              .visibility(protoclass().visibility())
              .build();
        }
  
        ExecutableElement method = (ExecutableElement) protoclass().sourceElement();
        String type = method.getReturnType().toString();
  
        return ImmutableConstitution.NameForms.builder()
            .simple(NA_ERROR)
            .relativeRaw(type)
            .packageOf(NA_ERROR)
            .relativeAlreadyQualified(true)
            .visibility(protoclass().visibility())
            .build();
      }
      return typeEnclosing();
    }
docs: Value is the canonical outside look of the value type. It should be either
  {@link #typeAbstract()} or {@link #typeImmutable()}.
  For factory it is a special surrogate.
  @return canonical value type name forms