reflect/protodesc: robustify dependency resolution implementation

Overview of changes:
* Add an option that specifies whether to replace unresolvable references
with a placeholder instead of producing an error. Since the prior behavior
produced placeholders (not always), we default to that behavior for now,
but will enable strict resolving in a future CL.
* The option is not yet exported because there is concern about what the
public API should look like. This will be exposed in a future CL.
* Unlike before, we now permit placeholders for unresolvable enum values.
* We implement relative name resolution logic.
* We handle the case where the type is unknown, but type_name is specified.
In such a case, we populate both FieldDescriptor.{Enum,Message} and leave
the FieldDescriptor.Kind with the zero value. If the type_name happened
to resolve, we use that to determine the type.
* If a placeholder is used to represent a relative name,
the FullName reports an invalid full name with a "*." prefix.

Change-Id: Ifa8c750423c488fb9324eec4d033a2f251505fda
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/184317
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/encoding/defval/default.go b/internal/encoding/defval/default.go
index f03acdf..7cde945 100644
--- a/internal/encoding/defval/default.go
+++ b/internal/encoding/defval/default.go
@@ -112,7 +112,7 @@
 			return pref.ValueOf(b), nil, nil
 		}
 	}
-	return pref.Value{}, nil, errors.New("invalid default value for %v: %q", k, s)
+	return pref.Value{}, nil, errors.New("could not parse value for %v: %q", k, s)
 }
 
 // Marshal serializes v as the default string according to the given kind k.
@@ -168,7 +168,7 @@
 			return s, nil
 		}
 	}
-	return "", errors.New("invalid default value for %v: %v", k, v)
+	return "", errors.New("could not format value for %v: %v", k, v)
 }
 
 // unmarshalBytes deserializes bytes by applying C unescaping.