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 moved the checks to `create()`.
If I understand correctly, however, the problem remains.  Imagine `to_sql` is called once with a passed-in metadata object, and `_create_table_setup` (called from the constructor) adds a table called `test` to that metadata object.  Now, when `to_sql` is called again with the same metadata object, `_create_table_setup` will raise an exception --- it can't add the table again.  This will occur even if we don't `create` or `insert` on the first or the second call.