Refactor the client (again) to better support auth

Allows consumers to provide their own transports for common cases.

Fixes #1499
Adds basic support for #1473
Derek and I were going to talk and have context be autoset once it's needed.  So clients that don't know about context or don't care don't have to set it (as appropriate) - clients that do should set it up front.  Not passing context should be equivalent to using the correct default context (which client package probably knows better than the call site).

----- Original Message -----
> > @@ -47,11 +49,9 @@ func main() {
> >  
> >  	verflag.PrintAndExitIfRequested()
> >  
> > -	// TODO: security story for plugins!
> > -	ctx := api.NewContext()
> > -	kubeClient, err := client.New(ctx, *master, latest.OldestVersion, nil)
> > +	kubeClient, err := client.New(clientConfig)
> 
> where is the scheduler's api.NewContext set?
> 
> ---
> Reply to this email directly or view it on GitHub:
> https://github.com/GoogleCloudPlatform/kubernetes/pull/1500/files#r18295147