text: Title: kubectl --local is not quite local across all the commands
  Body: This situation was discovered when I wanted to remove deprecated functionality in https://github.com/kubernetes/kubernetes/pull/90243. Unfortunately, due to how we are constructing client in almost every kubectl command this removal ended up with the following bug https://github.com/kubernetes/kubernetes/issues/90074.
  
  The reason for that is that in each command's `Complete` method we create a client in one of the following ways:
  ```go
  o.Client, err = batchv1client.NewForConfig(clientConfig)
  if err != nil {
  	return err
  }
  ```
  ```go
  dynamicClient, err := f.DynamicClient()
  if err != nil {
  	return err
  }
  ```
  ```go
  discoveryClient, err := f.ToDiscoveryClient()
  if err != nil {
  	return err
  }
  ```
  The problem is that with the deprecated code from #90243 removed all of the above calls will fail when creating a client with:
  ```
  error: Missing or incomplete configuration info.  Please point to an existing, complete config file:
  
    1. Via the command-line flag --kubeconfig
    2. Via the KUBECONFIG environment variable
    3. In your home directory as ~/.kube/config
  ```
  which does not happen if we silently default the server to `http://localhost:8080` in deprecated `getDefaultServer`. 
  
  There are two possible approaches to this problem:
  1. Go through each and every single command and add conditions for `--local` flag and not to create clients when it is specified.
  2. Provide a smart mechanism allowing to inject dependencies (in this particular case, we are talking about clients).
  
  During SIG-CLI call on July 15th, we agreed that solution 1 is a short-term and rather hacky approach to the problem and we would like to see this being approached as described in no. 2. 
  
  Any proposals to this should be discussed with @soltysh or during one of sig-cli calls. 