Make list pods constant time

This moves all status-computing logic to the pod cache, and also starts caching more things (like whether a node exists). Will make it easier in the future to move status computation into a separate process or all the way down to kubelet.

Fixes #2951

Fixes #2975

Improves #2922

I'm having troubles running e2e. Will figure that out tomorrow and also squash.
I'll change, but I don't think it's evil-- it's the only way to lock and do a one line ```return mapThatMustBeLocked["foo"]```. Of course I'm not actually doing that here. But the point is it's OK because of the return.