fix data races and turn on race detector by default.

In #309, we ended up with using ``sync.Cond``, which introduced the data race again.

In this PR, I use channel instead of ``sync.Cond`` similar to the first commit in #309. The difference is that instead of using close() to broadcast, I used the send operation.
Does this work?

I would think manifest is a struct, in a constant location on the stack, and thus, simply taking its address won't eliminate the data sharing, it will always be a pointer to the same location, which will just keep getting assigned different values.

Pehaps my understanding of Go for loops is incorrect, though.