3705: generalize PullList module to BlockWorkList

Full description at https://arvados.org/issues/3705
I believe this accurately tests everything your code does, with the helper methods I proposed, but let me know if I missed something:

````go
func TestBlockWorkListReaderBlocks(t *testing.T) {
	var input = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

	b := NewBlockWorkList()
	sendmore := make(chan int)
	done := make(chan int)
	go func() {
		expectFromChannel(t, b.NextItem, input[0:5])
		expectChannelEmpty()
		sendmore <- 1
		expectFromChannel(t, b.NextItem, input[5:])
		b.Close()
		done <- 1
	}()

	// Write a slice of the first five elements and wait for a signal
	// from the reader.
	b.ReplaceList(makeTestWorkList(input[0:5]))
	
	// Wait until the reader has confirmed that the channel is empty before writing the final five elements.
	<-sendmore
	b.ReplaceList(makeTestWorkList(input[5:]))

	// Wait for the reader to complete.
	<-done
}
````