Updated file-reading and opening for CSV files

This change adds functionality to the csv.py and fixes some small bugs.
The added functionality makes using gzip files transparent to the user. 
If opening a gzip file, we don't have to specify
```python
import gzip
CSV("path/to/csv.gz", open=gzip.open)
```
Now, we can leave the "open=gzip.open" out and CSV() will discover that for itself.
The "open" parameter can still be specified, so this change is backwards compatible.

Bugs fixed:
 Added the "mode" parameter to calls to open(), and changed all open() calls to the correct self.open()




style wise i think we've adopted the convention of `_` being ignored results.

also can you put spaces around operators and after commas? minor detail, but help keeps things a bit more readable there's a few places below where this needs to happen as well