Add support for floating ips in nova

Handling floating ips correctly across various openstack clouds is non-trivial, but it is an understandable problem space. Generally speaking, a user wants either a specific known floating ip, wants a public ip but does not care what ip - or wants one from a pool. This handles all three of those cases, as well as adding code to clean up during deletion, and to verify state on inspection so that if a server was created but did not get an IP, a subsequent run will fix the situation. The last case is also useful in the case that the config for a server is changed - such as promoting a replacement server to be the real server by moving the floating ip.