ENH: sql support for writing NaN + datetime64 values (GH2754, GH7103)

Closes #2754 
Closes #7103, #7936 (supercedes PR #8205 for this)

Database drivers expect `None` to translate this to `NULL`. 
Therefore, dataframe is cast to object dtype to convert `NaN` to `None`.

To check: performance impact. In principle should also not needed for integer colums (can't have NaNs)

Kind of API change: it did already work for postgresql (psycopg2), but it was translated to postgresql's `NaN` and now to `NULL` which is something different (but I think this is actually an improvement)
@jreback making a copy to reset the index to be able to also insert the index in the SQL table seems a bit stupid. 
It seems more logical if I could add these seperately to the `data_list`. Eg I could do something like:

```
if self.index:
    b_index = self.frame.index.to_series()._data.blocks[0]
    blocks = b_index + blocks
```
(and then of course taking possibly different levels into account, but you get the idea)

But is there a better way to get the index values into a block? (what is needed to have the datetime and nan handling, as these both can also occur in the index)