WIP - Allow kubectl to handle arbitrary objects

Kubectl will need to handle extension of object types for known (part of api.Scheme)
and unknown (defined via config or future ComponentPlugin extension mechanisms) from
the API server.  This pull request updates the create/update/delete flows for kubectl
to separate the versioning abstractions from the core code path via interfaces.

I will update the other code paths (get / describe) once we get through this review.
@ghodss @fabianofranz

The pull also contains unification of ResourceVersioner and SelfLinker and starts
using it within Kubectl. @lavalamp

A key goal of the pull is to continue to refine the runtime / meta abstractions to assist in client logic, and to allow other consumers of kubectl to support more than just types in api.Scheme (openshift)
@smarterclayton can you please split this PR and extract the ObjectTyper and ResourceMapper? I will need these to update my Config PR: https://github.com/GoogleCloudPlatform/kubernetes/pull/1958

Thanks!