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.
Well. I thought the following code will be the same:

```
for i := range someSlice {
    go func(idx int) {
        f(&someSlice[i])
    }(i)
}
```

```
for _, v := range someSlice {
    go func(value *int) {
        f(value)
    }(&v)
}
```

Even in #350, you are still passing the address of the object, which is actually stored inside the slice.

I've changed to follow #350 anyway.