Revert some of the UTF8 changes, use UTF8 only for files we know are UTF8
So we use ordinary read/writeFile for ordinary text files. For console output we use ordinary putStr etc and we'll just hope that haskell implementations catch up and deal with that sensibly. Don't assume captured program output is UTF8, use the default encoding. So we use binary mode IO along with UTF8 encoding and decoding only for file types that we specify to be UTF8, which are .cabal files and .hs/.lhs files only.