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)
The whole metadata handling stuff is a bit complicated, as I'm sure you know.

When the table object is first instantiated (but not yet added to a database), it is added to a blank metadata object (see L742).  The reason for this is that if the table already exists in the database, and hence gets reflected in `self.pd_sql.meta`, there is an error raised when we try to add the table object to that metadata again.  Since we want to be able to create a table object and generate schema SQL from it no matter the state of the database, we avoid this by adding it to a blank metadata.

However, when the table is actually created in the database (in this `create` method), we reattach the table object to the `self.pd_sql.meta` using the above code.  Effectively I try to keep `self.pd_sql.meta` in correspondence with what's actually in the db.