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)
Just some quick tests with the code above:

```
In [18]: %timeit sql.to_sql(df, 'test_frame', conn, if_exists='replace')
1 loops, best of 3: 4.98 s per loop

In [19]: %timeit [tuple((v for v in t[1:])) for t in df.itertuples()]
1 loops, best of 3: 441 ms per loop

In [20]: data_list = [tuple((v for v in t[1:])) for t in df.itertuples()]

In [21]: keys = df.columns

In [22]: %timeit [dict(zip(keys, row)) for row in data_list]
1 loops, best of 3: 1.08 s per loop
```
This is with 0.14.1 version of pandas. So doing both operations instead of one adds half a second to it, while it is really not that much of duplication to avoid this. BTW, I have also a PR that will improve the performance and deals with this code, see #8208