context manager support для sync

В рамках задачи #51 (closed) Connection.connect() был сделан фабричным методом класса, однако для управления временем жизни соединения сейчас всё ещё требуется явно вызывать close():

  connection = Connection.connect(dsn)
  try:
      cursor = connection.cursor()
      cursor.execute("SELECT 1")
  finally:
      connection.close()

В psycopg3 соединение поддерживает протокол контекстного менеджера, поэтому можно использовать фабричный connect(...) напрямую в with:

  with psycopg.connect(dsn) as connection:
      ...

Предлагается добавить поддержку контекстного менеджера для picopyn.synchronous.Connection, чтобы публичный API был ближе к psycopg3 и позволял безопасно закрывать соединение без ручного try/finally.

Ожидаемый результат:

  with picopyn.synchronous.connect(dsn) as connection:
      cursor = connection.cursor()
      cursor.execute("SELECT 1")

  with Connection.connect(dsn) as connection:
      cursor = connection.cursor()
      cursor.execute("SELECT 1")

Оба варианта должны возвращать открытый объект Connection внутри блока with и закрывать соединение при выходе из блока.

Предлагается, что нужно будет добавить методы __enter__ и __exit__

Исключения внутри блока with не должны подавляться.

Pool в рамках этой задачи можно не менять.