Sketch of idea for package to index data in etcd.  DO NOT MERGE

There are several components (apiserver, controller, scheduler) where we will want to:
- lookup an API object by key efficiently (without calling etcd).
- lookup an API object efficiently by something other than its key in etcd

This is a sketch of a more general mechanism.

Feedback of any sort welcomed.  I'm particularly thinking of @lavalamp and @smarterclayton who understand the etcd Watch interface well, which this would interact with.

Alternatives Considered:

We could write custom code for this in each binary that needs to do this.
That seems bad.

We could push changes into etcd to help us with indexing.
However, doing it in a go library allows:
- faster prototyping, without ruling out eventual contrib back to etcd
- control of memory size is responsibility of each go program, rather than etcd
- short-circuits the network path for mostly-read operations, with optimistic concurrency.


I think the objects these functions return should act like the old concept of a "Handle" that you have to lock before looking into them. The locking mechanism would freeze the results at a particular revision while you're looking (i.e., make a copy so you don't block other threads). (Optionally, you could request a particular revision?) Without this it's very tricky to do something like gathering a consistent initial state and then watching for subsequent changes in a race-free way.