Refactor address set code for greater flexibility.

For some reason, this code doesn't work.  While the refactor does not
appear to break acceptance/14-list-addresses, I simply _cannot_ find a
reason why it won't work for acceptance/19-list-addresses-0.1.  If
anyone can review this code and let me know what I'm doing wrong, I'd be
most appreciative!
diff --git a/servers.go b/servers.go
index fc5925d..634acaf 100644
--- a/servers.go
+++ b/servers.go
@@ -5,6 +5,7 @@
 
 import (
 	"fmt"
+	"github.com/mitchellh/mapstructure"
 	"github.com/racker/perigee"
 	"strings"
 )
@@ -55,6 +56,22 @@
 			},
 		})
 	})
+
+	// Compatibility with v0.0.x -- we "map" our public and private
+	// addresses into a legacy structure field for the benefit of
+	// earlier software.
+
+	if err != nil {
+		return ss, err
+	}
+
+	for _, s := range ss {
+		err = mapstructure.Decode(s.rawAddresses, &s.Addresses)
+		if err != nil {
+			return ss, err
+		}
+	}
+
 	return ss, err
 }
 
@@ -71,6 +88,17 @@
 			},
 		})
 	})
+
+	// Compatibility with v0.0.x -- we "map" our public and private
+	// addresses into a legacy structure field for the benefit of
+	// earlier software.
+
+	if err != nil {
+		return s, err
+	}
+
+	err = mapstructure.Decode(s.rawAddresses, &s.Addresses)
+
 	return s, err
 }
 
@@ -400,6 +428,8 @@
 //
 // Addresses provides addresses for any attached isolated networks.
 // The version field indicates whether the IP address is version 4 or 6.
+// Note: only public and private pools appear here.
+// To get the complete set, use the AllAddressPools() method instead.
 //
 // Created tells when the server entity was created.
 //
@@ -473,9 +503,9 @@
 // http://docs.rackspace.com/servers/api/v2/cs-devguide/content/ch_extensions.html#ext_status
 // for more details.  It's too lengthy to include here.
 type Server struct {
-	AccessIPv4         string            `json:"accessIPv4"`
-	AccessIPv6         string            `json:"accessIPv6"`
-	Addresses          AddressSet        `json:"addresses"`
+	AccessIPv4         string `json:"accessIPv4"`
+	AccessIPv6         string `json:"accessIPv6"`
+	Addresses          AddressSet
 	Created            string            `json:"created"`
 	Flavor             FlavorLink        `json:"flavor"`
 	HostId             string            `json:"hostId"`
@@ -494,6 +524,27 @@
 	OsExtStsPowerState int               `json:"OS-EXT-STS:power_state"`
 	OsExtStsTaskState  string            `json:"OS-EXT-STS:task_state"`
 	OsExtStsVmState    string            `json:"OS-EXT-STS:vm_state"`
+
+	rawAddresses map[string]interface{} `json:"addresses"`
+}
+
+// AllAddressPools returns a complete set of address pools available on the server.
+// The name of each pool supported keys the map.
+// The value of the map contains the addresses provided in the corresponding pool.
+func (s *Server) AllAddressPools() (map[string][]VersionedAddress, error) {
+	fmt.Printf("-- %#v\n", s.rawAddresses)
+	m := make(map[string][]VersionedAddress, 0)
+	for pool, subtree := range s.rawAddresses {
+		fmt.Println("POOL: ", pool)
+		fmt.Printf("  %#v\n", subtree)
+		v := make([]VersionedAddress, 0)
+		err := mapstructure.Decode(subtree, &v)
+		if err != nil {
+			return nil, err
+		}
+		m[pool] = v
+	}
+	return m, nil
 }
 
 // NewServerSettings structures record those fields of the Server structure to change