A WaitGroup waits for a collection of processes to finish.
The main process calls add to set the number of processes to wait for.
Then each of the processes runs and calls done when finished. At the same
time, wait can be used to block until all processes have finished.