Add an error return to the EachPage closure.

Because the Extract functions, at the very least, have an error parameter, and it's
kind of a pain to capture it outside the closure.
diff --git a/collections.go b/collections.go
index ba83965..1830ff0 100644
--- a/collections.go
+++ b/collections.go
@@ -41,7 +41,7 @@
 
 // EachPage iterates over each page returned by a Pager, yielding one at a time to a handler function.
 // Return "false" from the handler to prematurely stop iterating.
-func (p Pager) EachPage(handler func(Page) bool) error {
+func (p Pager) EachPage(handler func(Page) (bool, error)) error {
 	currentURL := p.initialURL
 	for {
 		currentPage, err := p.advance(currentURL)
@@ -49,7 +49,11 @@
 			return err
 		}
 
-		if !handler(currentPage) {
+		ok, err := handler(currentPage)
+		if err != nil {
+			return err
+		}
+		if !ok {
 			return nil
 		}
 
diff --git a/collections_test.go b/collections_test.go
index 665062b..b1fe6af 100644
--- a/collections_test.go
+++ b/collections_test.go
@@ -46,18 +46,18 @@
 
 func TestEnumerateSinglePaged(t *testing.T) {
 	callCount := 0
-	err := setupSinglePaged().EachPage(func(page Page) bool {
+	err := setupSinglePaged().EachPage(func(page Page) (bool, error) {
 		callCount++
 
 		expected := []int{1, 2, 3}
 		actual, err := ExtractSingleInts(page)
 		if err != nil {
-			t.Fatalf("Unexpected error extracting ints: %v", err)
+			return false, err
 		}
 		if !reflect.DeepEqual(expected, actual) {
 			t.Errorf("Expected %v, but was %v", expected, actual)
 		}
-		return true
+		return true, nil
 	})
 	if err != nil {
 		t.Fatalf("Unexpected error calling EachPage: %v", err)
@@ -103,11 +103,10 @@
 	pager := createLinked(t)
 
 	callCount := 0
-	err := pager.EachPage(func(page Page) bool {
+	err := pager.EachPage(func(page Page) (bool, error) {
 		actual, err := ExtractLinkedInts(page)
 		if err != nil {
-			t.Errorf("Unable to extract ints from page: %v", err)
-			return false
+			return false, err
 		}
 
 		t.Logf("Handler invoked with %v", actual)
@@ -122,7 +121,7 @@
 			expected = []int{7, 8, 9}
 		default:
 			t.Fatalf("Unexpected call count: %d", callCount)
-			return false
+			return false, nil
 		}
 
 		if !reflect.DeepEqual(expected, actual) {
@@ -130,7 +129,7 @@
 		}
 
 		callCount++
-		return true
+		return true, nil
 	})
 	if err != nil {
 		t.Errorf("Unexpected error for page iteration: %v", err)
diff --git a/openstack/client.go b/openstack/client.go
index 891726a..a5d0bc8 100644
--- a/openstack/client.go
+++ b/openstack/client.go
@@ -193,11 +193,11 @@
 func v3endpointLocator(v3Client *gophercloud.ServiceClient, opts gophercloud.EndpointOpts) (string, error) {
 	// Discover the service we're interested in.
 	var services = make([]services3.Service, 0, 1)
-	var err error
-	services3.List(v3Client, services3.ListOpts{ServiceType: opts.Type}).EachPage(func(page gophercloud.Page) bool {
+	servicePager := services3.List(v3Client, services3.ListOpts{ServiceType: opts.Type})
+	err := servicePager.EachPage(func(page gophercloud.Page) (bool, error) {
 		part, err := services3.ExtractServices(page)
 		if err != nil {
-			return false
+			return false, err
 		}
 
 		for _, service := range part {
@@ -206,7 +206,7 @@
 			}
 		}
 
-		return true
+		return true, nil
 	})
 	if err != nil {
 		return "", err
@@ -222,13 +222,14 @@
 
 	// Enumerate the endpoints available for this service.
 	var endpoints []endpoints3.Endpoint
-	endpoints3.List(v3Client, endpoints3.ListOpts{
+	endpointPager := endpoints3.List(v3Client, endpoints3.ListOpts{
 		Availability: opts.Availability,
 		ServiceID:    service.ID,
-	}).EachPage(func(page gophercloud.Page) bool {
+	})
+	err = endpointPager.EachPage(func(page gophercloud.Page) (bool, error) {
 		part, err := endpoints3.ExtractEndpoints(page)
 		if err != nil {
-			return false
+			return false, err
 		}
 
 		for _, endpoint := range part {
@@ -237,7 +238,7 @@
 			}
 		}
 
-		return true
+		return true, nil
 	})
 	if err != nil {
 		return "", err
diff --git a/openstack/identity/v3/endpoints/requests_test.go b/openstack/identity/v3/endpoints/requests_test.go
index 70dfd8e..f988770 100644
--- a/openstack/identity/v3/endpoints/requests_test.go
+++ b/openstack/identity/v3/endpoints/requests_test.go
@@ -128,12 +128,12 @@
 	client := serviceClient()
 
 	count := 0
-	List(client, ListOpts{}).EachPage(func(page gophercloud.Page) bool {
+	List(client, ListOpts{}).EachPage(func(page gophercloud.Page) (bool, error) {
 		count++
 		actual, err := ExtractEndpoints(page)
 		if err != nil {
 			t.Errorf("Failed to extract endpoints: %v", err)
-			return false
+			return false, err
 		}
 
 		expected := []Endpoint{
@@ -159,7 +159,7 @@
 			t.Errorf("Expected %#v, got %#v", expected, actual)
 		}
 
-		return true
+		return true, nil
 	})
 	if count != 1 {
 		t.Errorf("Expected 1 page, got %d", count)
diff --git a/openstack/identity/v3/services/requests_test.go b/openstack/identity/v3/services/requests_test.go
index 9fea519..59cefe3 100644
--- a/openstack/identity/v3/services/requests_test.go
+++ b/openstack/identity/v3/services/requests_test.go
@@ -99,12 +99,11 @@
 	client := serviceClient()
 
 	count := 0
-	List(client, ListOpts{}).EachPage(func(page gophercloud.Page) bool {
+	err := List(client, ListOpts{}).EachPage(func(page gophercloud.Page) (bool, error) {
 		count++
 		actual, err := ExtractServices(page)
 		if err != nil {
-			t.Errorf("Unexpected error extracting services: %v", err)
-			return false
+			return false, err
 		}
 
 		desc0 := "Service One"
@@ -128,8 +127,11 @@
 			t.Errorf("Expected %#v, got %#v", expected, actual)
 		}
 
-		return true
+		return true, nil
 	})
+	if err != nil {
+		t.Errorf("Unexpected error while paging: %v", err)
+	}
 	if count != 1 {
 		t.Errorf("Expected 1 page, got %d", count)
 	}