Handle HTTP 404 errors in BaseFetcher
Handle HTTP 404 errors in BaseFetcher

When using the default urllib.urlretrieve() method, the method
happily creates a local file containing the webserver's error
response rather than indicating that there was an HTTP error.

The fix involves a custom subclass of urllib.FancyURLopener that
raises an exception, as suggested by
http://stackoverflow.com/a/1308846/386210

Currently, it only cares about 404 errors.  If we need more
error handling, it might be worthwhile to use something other
than urllib.urlretrieve().  The way that you do it with requests
is mentioned here: http://stackoverflow.com/a/14114741/386210.

Addresses https://github.com/openelections/core/issues/179

cathydeng/openelections-core,openelections/openelections-core,datamade/openelections-core,datamade/openelections-core,cathydeng/openelections-core,openelections/openelections-core