ENH: 'to_sql()' add param 'method' to control insert statement (#21103)
Also revert default insert method to NOT use multi-value.

This is WIP. I would like to gather feedback on API change before going on.

- support callables as parameter?
- support to_sql() when used on SQLite3 (without SQLAlchemy)

Sample file for performance benchmarking
```
import time

import numpy as np
import pandas as pd
from sqlalchemy import create_engine


N_COLS = 20
N_ROWS= 200000
# one of to_sql insert methods: None/'default', 'multi', 'copy'
METHOD = 'copy'

engine = create_engine('postgresql://postgres:@localhost/pandas_perf')
conn = engine.connect()

start = time.time()
df = pd.DataFrame({n: np.arange(0, N_ROWS, 1) for n in range(N_COLS)})

# convert df to sql table
df.to_sql('test', conn, index=False, if_exists='replace',
          chunksize=1000, method=METHOD)

print('WRITE: {}'.format(time.time() - start))
```

- [x] closes #21103 & closes #21146 & #8953
- [x] tests added / passed
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry
- [ ] update docstrings/docs
