REF: simplify latex formatting
- [x] closes https://github.com/pandas-dev/pandas/issues/35790
- [x] tests added ``pandas/tests/io/formats/test_latex.py``
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`

Refactor ``to_latex`` using polymorphism and the builder design pattern.

Polymorphism
--------------

Previously there was a complicated logic in multiple methods
for either longtable or regular table.
This PR implements various builders:
  - ``RegularTableBuilder``
  - ``LongTableBuilder``
  - ``TabularBuilder``

Selection of the appropriate builder is carried out in ``LatexFormatter``,
depending on the kwargs provided.

Each builder must implement construction of all the table's components:
  - Beginning and end of the environment,
  - Separators (top, middle, bottom),
  - Header,
  - Body.

This allows one eliminate complex logic throughout multiple methods.

Separate Concerns
------------------

Separated concerns: row formatting into string (separate class ``RowStringConverter``)
is carried out independently of the table builder.
Derived from ``RowStringConverter`` are two classes used to iterate over headers or body of the tables:
  - ``RowHeaderIterator``
  - ``RowBodyIterator``

Extract Methods
----------------

Multiple methods were extracted to improve code readability.
