3705: generalize PullList module to BlockWorkList

Full description at https://arvados.org/issues/3705
Using this helper method requires some boilerplate in each test to store the output. Why not just check it as you read it? How about this:

func expectFromChan(t *testing.T, c <-chan int, expected []int) {
	for i := range expected {
		actual, ok := <- c
		if !ok {
			t.Fatalf("Expected %v but channel was closed after receiving the first %d elements correctly.", expected, i)
		} else if actual != expected[i] {
			t.Fatalf("Expected %v but received '%d' after receiving the first %d elements correctly.", expected, actual, i)
		}
	}
} 

and also:

func expectChannelClosed(t *testing.T, c <-chan int) {
	received, ok := <- c
	if ok {
		t.Fatalf("Expected channel to be closed, but received %s instead", received)
	}
}