factor out close logic. This changes semantics slightly was we no longer raise an IOE if file closure fails.