Fix cache to use the "List then Watch" pattern.

Closes #1310
nit: ownership