etcd: Split Get and Watch()
Changes:
- Split Get() and Watch() operations.
- Use AfterIndex to ensure that we don't lose changes between Get() and Watch() operations.
- Given that we need one etcd client per watched key, track the key as part of the client state instead of requiring to specify it on every Get()/Watch() operation
- Return a well-known error when the requested key isn't found, this allows to the control plane to retry every X seconds till the etcd key is present
This MR ships the commits from !36 (merged), !37 (merged), !38 (merged) and !39 (merged)