Add retries and logging to GeoNames requests

This addresses #7705. GeoNames name searches failed with URLError when
a bad connection or url interfered with openurl. This allows retries
in the case of short-term issues and handles total failure by logging
and passing to the next geocoder.
And actually, since `result` is determined by the external endpoint, over which we have no control, it could theoretically be something else, so I don't know how far we want to go into it, but there may need to be some exception handling somewhere.  (`_get_result()` just calls `json.loads()` and returns whatever it gets.)

Also, for future consideration: http://effbot.org/zone/python-with-statement.htm ... the `with` statement and classes made to support it are things to consider.