Smart deploy, simplify the .gitlab-ci.yml syntax by assuming Kubernetes
### Description
Deploying via shell scripts is powerful in that it's incredibly flexible, but sometimes it's too cumbersome, ugly, or not functional enough. We need a higher-level construct, especially for deploys, that let's developers easily configure common deployment scenarios.
### Proposal
* Introduce specific keywords for various deployment scenarios such as `kubernetes`, ideally through extensible plugins (#14178).
* The deploy plugin may run in the context of the GitLab rails server rather than the GitLab runner. There are various pros and cons to this.
* Running in Rails allows access to deployment variables without having to expose them to the runners.
* Running in Rails allows easier return of richer information than simple pass/fail exit code. e.g. return information needed for connecting a terminal to a container. (Runners could support this, but we'd have to extend the API)
* Plugins running in Rails might be more approachable than writing in Go.
* Either way, the plugin would be able to directly connect services via API without needing scripts or CLIs.
* Plugins could be tightly tied to Services to provide the ability to store variables or otherwise configure deployment at a project level (#23859)
* Richer interactions could allow actions beyond simple deployment such as:
* access a terminal that connects to running environments
* smart monitoring of deployments
* incremental/rolling deploys, canary deploys, blue/green deploys, traffic vectoring, etc.
* simplifying closing environments
* restart/pause/etc of environments
* The obvious downside is that this would be GitLab-specific, and up to us to maintain as things change.
```
review_app:
kubernetes:
pod: my/pod/file
variables:
MY_APP_DOMAIN: review-$DOMAIN.app.com
environment:
name: review/$APP
```
### Links / references
* From https://gitlab.com/gitlab-org/gitlab-ce/issues/22864#note_16790373 and #23286
* GitLab Runner plugins: #14178
/cc @ayufan
issue