Sync pods asynchronously in the Kubelet.

This makes two main changes:
- Runs syncPod in a separate Go routine (and enforces only one of those
  runs at a time).
- Uses the pod list to determine if a container should be running or
  should be killed (used to use the output of syncPod).

Since Docker pulls are synchronized by the Docker daemon we still block
on that, but pods can now be removed and prepared for starting without
blocking on long pulls.
I guess I still am confused about this inner function here, although the use of defer is great. Why can't this function just be like below?

```
 +func (self *podWorkers) Run(podFullName string, action func()) {
 +	self.lock.Lock()
 +	defer self.lock.Unlock()
 +
 +	// This worker is already running, let it finish.
 +	if self.workers.Has(podFullName) {
 +		return
 +	}
 +
 +	// Run worker async.
 +	self.workers.Insert(podFullName)
 +	go func() {
 +		defer util.HandleCrash()
 +		action()
 +
 +		self.lock.Lock()
 +		defer self.lock.Unlock()
 +		self.workers.Delete(podFullName)
 +	}()
 +}
```