Watch based client cache

In preparation for moving the scheduler into its own plugin, these are some objects that make it really easy.

...of course this won't be useful without more advanced watching in the server. I'm working on that.
go-ism says that this should be:

if err := fieldPtr(v, "ID", &g.id); err != nil {
  return g, err
}
...