CLN: clean up data.py
closes #4001 
closes #3982
closes #4028

everything still work? (not sure how many tests we actually have on io.data)

can u squash the num of commits down a bit?
 @jreback yes everything still works, but not quite finished yet...will squash when i check off the list items
 the fact that everything still works after all these changes makes me think that there is potentially a lot of untested code in `data.py`...
 @cpcloud I agree with you on that. Do you know why the main entry point is named like a class (`DataReader`) but isn't really a class? It's confusing because the functions seem really similar and a good candidate for abstracting into a class definition. Not even necessarily because it would reduce code duplication, but because it could make the file easier to follow (i.e., a workflow described as `get_data` -> `clean_data` -> `package_data [into appropriate type, like Series/Panel]`) and would allow us to do a better job in standardizing error handling and making it easier to add in new data sources (or allow people to make plugins or something).
 Would it make sense to set a default timeout on these requests? (you can pass a `timeout` keyword to urlopen). Helps the test suite and gives more flexibility to users. 
 possibly...somewhat related is that there's a `retry_count` all over the place which i think may be unnecessary and might overlap a bit with `timeout`...timeout might be nice although i'm not sure when you'd want to use it. maybe u have some specific use cases in mind?
 @jreback on this clean up i have those tests that fail skip if they raise an `AttributeError`. i feel a little weird about that .... how should i handle this error, seems hard to predict since lxml will return but then not have any html...how to test for that? could return `nan` if that happens or raise...
 I would have an exception fail them. I guess you can't really 'validate' these consistently. I think these reutrn a list, so a len(0) list is valid then; only complete the rest of the test if you have len > 0. Maybe I would print a warning (in the test) if this is the case, so that when running in the command line, we know this has 'failed'.

AssertionWarning? a little bit cheesy...but what can you do
 hold on maybe there's something different between using expiry vs passing month/year explicitly. only the warning tests seem to be failing
 nope that looks ok
 after this passes i'm going to do one more rehash and push then im gonna merge
 going to also run tox a few times in a row to see if i can get the warnings to show up
 @jreback any objections here?
 kind of a big overhaul, but badly needed 
 looks good
 round 42 on this...here we go.
 I picked a hell of a time to decide to make a minor change to data.py! Things are moving quickly :+1: I'll have to check back on #4044 once the dust has settled
 sorry man there's just a bunch of stuff that needed to essentially be rewritten and network stuff cleared up (still some issues there)
