REF: eliminate method _write() in json writers
- [ ] closes #xxxx
- [ ] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

Attempted to figure out what is wrong with the issue https://github.com/pandas-dev/pandas/issues/36211.
I noticed that the private methods ``_write`` are defined in each child of class ``Writer``, which simply re-define ``obj`` and call the parent ``_write`` method.
It turns out that the source of the recursion does not lie there, but I refactored the module slightly by removing the mediator ``_write`` method. Instead I put the differences between the writers into their ``__init__`` method.

It seems that source of the problem with the recursion mentioned in the bug report is in ``pandas/_libs/src/ujson/python/objToJSON.c``.
If there is a problem with updating ``self.obj`` in ``__init__`` of child classes, then we probably should abandon this PR. Maybe other opinion? Yea I don't think this is an improvement as it is better for the subclasses to override the implementation where appropriate rather than modifying the object that gets stored during initialization.

Let's keep open for a few days as someone may disagree Would you consider another implementation? I created a new property ``obj_to_write`` (we can call it a ``table_obj``, or something like this). This allowed us to avoid re-definition of ``self.obj``, reduce ``__init__`` boilerplate and also (as initially) get rid of ``_write`` method. nitpick about annotations, otherwise LGTM All checks are good after merging with master, except Windows:
```
##[error]We stopped hearing from agent Azure Pipelines 11. 
```

@jbrockmendel, unfortunately, I cannot fully resolve the issue with typing. Please see my comment above in relation to ``NDFrame`` and ``FrameOrSeries``. Thanks @ivanovmg 