rebuild: refactor parallel scheduler
diff --git a/alldocs.go b/alldocs.go
index 85e106b..bb5e889 100644
--- a/alldocs.go
+++ b/alldocs.go
@@ -62,6 +62,8 @@
 Flags:
 	-precaire
 		allow the use of insecure protocols.
+	-connections
+		count of parallel download connections.
 
 Update a local dependency
 
diff --git a/rebuild.go b/rebuild.go
index b66bd0c..87f13cd 100644
--- a/rebuild.go
+++ b/rebuild.go
@@ -6,6 +6,8 @@
 	"log"
 	"os"
 	"path/filepath"
+	"sync"
+	"sync/atomic"
 
 	"github.com/FiloSottile/gvt/gbvendor"
 )
@@ -58,22 +60,30 @@
 		return fmt.Errorf("could not load manifest: %v", err)
 	}
 
-	var semaphore = make(chan int, rbConnections)
-	var errorsChan = make(chan error, rbConnections)
-
-	for _, dep := range m.Dependencies {
-		go func(d vendor.Dependency) {
-			semaphore <- 1
-			errorsChan <- downloadDependency(d)
-			<-semaphore
-		}(dep)
+	var errors uint32
+	var wg sync.WaitGroup
+	depC := make(chan vendor.Dependency)
+	for i := 0; i < int(rbConnections); i++ {
+		wg.Add(1)
+		go func() {
+			defer wg.Done()
+			for d := range depC {
+				if err := downloadDependency(d); err != nil {
+					log.Printf("%s: %v", d.Importpath, err)
+					atomic.AddUint32(&errors, 1)
+				}
+			}
+		}()
 	}
 
-	for _ = range m.Dependencies {
-		err = <-errorsChan
-		if err != nil {
-			return err
-		}
+	for _, dep := range m.Dependencies {
+		depC <- dep
+	}
+	close(depC)
+	wg.Wait()
+
+	if errors > 0 {
+		return fmt.Errorf("failed to fetch %d dependencies", errors)
 	}
 
 	return nil