use goroutines to execute callback functions and start the pipeline, avoid the possible deadlock issue.

If don't use goroutines, the below case will deadlock:
1. Start a future (FutureA). Then add a onComplete callback function that send to a nobuffer channel (channelA)
2. Start a loop to receive from channelA
3. When receive a value form channelA, complete the FutureA.
4. The OnComplete callback be called in the goroutines that complete the FutureA
5. OnComplete callback be blocked because the receive action is executed (step 3).
6. goroutines deadlocks because send and receive action are in a goroutines.

We can reproduce deadlock issue in WhenAny() if remove the goroutines.