Fix to merge code from `_create_table_statement` and `get_schema`

Reorganized a lot of the SQL schema creation code.  Now database table is not dropped / create when `PandasSQLTable` object is instantiated, but instead when `insert` method is called on it.  This allow us to `get_schema` to generate `CREATE TABLE` code without actually creating the table.
(Includes updates from #8083, so will have to be rebased when that is merged)
I realize this is probably not very scientific, but I timed the following script:
```python
import sqlalchemy
import pandas.io.sql as sql
import pandas as pd
import numpy as np

conn = sqlalchemy.create_engine('sqlite:///:memory:')
df = pd.DataFrame(np.random.random(size=(150000,10)))
sql.to_sql(df, 'test_frame', conn)
```
and it ran at the same speed for both the master branch and the new insert code.