Issue 1:
As part of #33900 and also long running desires to clean up some incomplete abstractions, we need to normalize and resolve the status of pkg/api/unversioned (which is versioned) by moving it to a versioned package.

All "common" server logic will be in pkg/apis/meta/v1, or associated with that package.

Any internal versions of those objects will be in pkg/apis/meta/internalversion

All other objects (versioned or internal) will directly reference the types in pkg/apis/meta/v1

Any interfaces or abstractions that deal with ObjectMeta in its "v1" form will be located in that package (like unstructured and the ListAccessor interfaces)

Types in other groups that duplicate these objects will be removed (eg. v1.ListOptions)

External and internal group versions will call a AddToGroupVersion method from pkg/apis/meta/v1 that registers common types, and other group versions will stop directly registering *Options and other reusable types.

'pkg/watch/versioned' is part of this interface and should be folded in to pkg/apis/meta/v1

Refactors to perform:

Move pkg/api/unversioned to pkg/apis/meta/v1 and use metav1 to reference it

This identifies that these types are "versioned" and will be part of the "meta.k8s.io" API group in #33900. This group composes all of our common, cross group reusable bits. We use metav1 to reference it internally to be consistent with our other versioned API package names.

Move pkg/watch/versioned into pkg/apis/meta/v1, and move the decoder/encoder in that package into pkg/client/restclient/watch

The watch event is versioned and has minor conversion logic. The decoders and encoders are used only be pkg/apiserver and pkg/client/restclient.

Move pkg/runtime/unstructured*.go into pkg/apis/meta/v1/unstructured

The unstructured types implicitly depend on the metav1 schema (they cannot be used against any other type) and should be identified as versioned locked. In the future, we could introduce abstractions that let us pick the appropriate unstructured type.

Move pkg/api/types.go#ListOptions|ExportOptions|DeleteOptions to pkg/apis/meta

These are internal types deserialized from client input and used by client libraries and pkg/apiserver.

Move ObjectMeta into pkg/apis/meta/v1 and remove the internal ObjectMeta

ObjectMeta is part of the metav1 api (used by unstructured) and so should not be represented differently. All internal code should be adapted to use this field.

Remove pkg/api/meta/metatypes and use pkg/apis/meta/v1 instead

Remove most methods from pkg/api/meta in favor of methods in pkg/apis/meta/v1.

Copy a temporary version of pkg/api/unversioned as required by heapster/metrics/v1alpha temporarily to preserve internal code until we can update heapster to use the new package.

Issue 2:
Forked from #1743

One of the critical features we're lacking on the configuration front is template parameterization. We should decide on what approach we want to take.

Working list of requirements:

It should be schema-respecting, not arbitrary textual transformation, in order to facilitate schema validation and independent substitution/decoration passes.

Input parameters should be clearly declared, such as to facilitate form generation, as discussed in #4210 and #6487.

Substitution should be independent of reconciliation, as per @ghodss's comment.