Open filename for writing and return file object
Function checks if file exists (and raises IOError if overwrite=False) and creates necessary directiories as needed.