support binary file handles in to_csv
- [x] fixes #19827, fixes #35058, fixes #23854 *, fixes #13068 *, and fixes #22555
- [x] 3 tests added
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

The first commit addresses https://github.com/pandas-dev/pandas/issues/35058#issuecomment-653844610: python's `open` cannot take an `encoding` argument when `mode` contains a `'b'` (opened in binary mode). This avoids an error when executing `df.to_csv("output.csv", mode="w+b")`.

The second commit fixes #35058, #19827,  #23854 *, and #13068 *: `to_csv` supports file handles in binary mode if `mode` contains a `b` and it honors `encoding`. `to_csv` re-invented a lot that was already done in `get_handle`. Let `get_handle` do the heavy lifting and remove all special cases from `to_csv`.

The third commit fixes #22555: some compression algorithms did not set the mode to be writeable for file handles. Together with the re-factoring in the second commit, it is now possible to write to binary file handles with compression!

*requesting an encoding for a non-binary file handles through `to_csv` still doesn't work but imho also doesn't make sense: specify the encoding yourself when opening the file or use a binary file handle