Rework CGroup PID reading runnable to prevent crashes
Sometimes the CGroup gets deleted before the Runnable finishes, causing a crash when we try to lock the PID lock. Since we have no way of tracking the CGroup object lifetime, rework the code to instead have the CGroup wait on the runnable when needed. Effectively this turns the runnable into more of a Future.