Database.session_start() locking error
Thanks, switched to RLock.
Problem:
When `Database.session_start()` is called before opening the connection to the database it tries to acquire the lock recursively first time in the `Database.session_start()` and second time in `Database.begin()`.

```
peewee.py:3195
def session_start(self):
    with self._lock:
->      return self.transaction().__enter__()
```
When entering `self.transaction().__enter__()` the lock is already acquired. Then it goes to:
```
peewee.py:4148
def __enter__(self):
    if self.db.transaction_depth() == 0:
->      self._begin()
    self.db.push_transaction(self)
    return self
```
```
peewee.py:4134
def _begin(self):
    args, kwargs = self._begin_args
->  self.db.begin(*args, **kwargs)
```
```
peewee.py:3245
def begin(self):
    if self.is_closed():
->      self.connect()
```
```
peewee.py:3023
def connect(self, reuse_if_open=False):
->  with self._lock:
        [...]
```
And reaches the point where the lock is acquired for the second time and deadlocks.

Solutions:
1. Use `threading.RLock` instead of `threading.Lock`. This fix the issue and still provide thread safety.
2. Open the connection if not opened in `Database.session_start()` before acquiring the lock.