Implemented as part of [ENG-10603](https://linear.app/comm/issue/ENG-10603/biggest-risk-factor-out-code-from-databasequeryexecutor)
I decided to use `std::shared_ptr` because on native, we might have multiple `SQLiteQueryExecutor` objects using one connection - this is because objects are created with `thread_local`.
This is not great for multithreading, because multiple threads can at the same time modify `connectionManager`; however, we use a queue and `GlobalDBSingleton`, which should mitigate.
Also note that this is not worse than it was; in past, multiple threads could also concurrently modify the state of the class, because props were static.
Depends on D14733