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.
If you can rely on `result` being a dict, then you can do `if result.get('geonames')`