BUG: update should try harder to preserve dtypes #4094
- [ ] closes #4094
- [x] tests added / passed
- [x] Ensure all linting tests pass, see [here](https://pandas.pydata.org/pandas-docs/dev/development/contributing.html#code-standards) for how to run them
- [x] whatsnew entry

I have to admit, I am not quite sure about the code in the [initial example](https://github.com/pandas-dev/pandas/issues/4094#issue-16212879). But the rest of the given examples ([1](https://github.com/pandas-dev/pandas/issues/4094#issuecomment-297671925), [2](https://github.com/pandas-dev/pandas/issues/4094#issuecomment-583174514)) are converted to tests and they do pass.

I would have loved to make better use of hypothesis in the tests, but currently [column](https://hypothesis.readthedocs.io/en/latest/numpy.html#hypothesis.extra.pandas.columns) does not support dtype strategies and neither does [from_dtype](https://hypothesis.readthedocs.io/en/latest/numpy.html#hypothesis.extra.numpy.from_dtype) (if I would define the elements of the column and infere the dtype).