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 TestBlockWorkListReplaceParitallyReadList(t *testing.T) {
	var originalList = []int{1, 1, 2, 3, 5, 8, 13, 21, 34}
	var replacementList = []int{1, 4, 9, 16, 25, 36, 49, 64, 81}

	b := NewBlockWorkList()
	b.ReplaceList(makeTestWorkList(originalList))

	// Read the first five elements from originalList.
	expectFromChannel(t, b.NextItem, originalList[:5])

	// Replace the work list and read five more elements.
	b.ReplaceList(makeTestWorkList(replacementList))
	expectFromChannel(t, b.NextItem, replacementList[:5])
}
````