PERF: improved perf in .to_json when lines=True
closes #14408

master

```
In [1]: np.random.seed(1234)

In [2]: N = 100000
   ...: C = 5
   ...: df = DataFrame(dict([('float{0}'.format(i), np.random.randn(N)) for i in range(C)]))

In [3]: %timeit df.to_json('foo.json',orient='records',lines=True)
1 loop, best of 3: 3.67 s per loop
```

PR (with proper encoding/decoding, IOW work directly on the bytes and minimize copies)

```
In [5]: %timeit df.to_json('foo.json',orient='records',lines=True)
10 loops, best of 3: 137 ms per loop
```

xref #14391 

cc @joshowen 
 ## [Current coverage](https://codecov.io/gh/pandas-dev/pandas/pull/14429?src=pr) is 85.26% (diff: 100%)

> Merging [#14429](https://codecov.io/gh/pandas-dev/pandas/pull/14429?src=pr) into [master](https://codecov.io/gh/pandas-dev/pandas/branch/master?src=pr) will decrease coverage by **<.01%**

``` diff
@@             master     #14429   diff @@
==========================================
  Files           140        140          
  Lines         50639      50622    -17   
  Methods           0          0          
  Messages          0          0          
  Branches          0          0          
==========================================
- Hits          43177      43161    -16   
+ Misses         7462       7461     -1   
  Partials          0          0          
```

> Powered by [Codecov](https://codecov.io?src=pr). Last update [286b9b9...e855e1f](https://codecov.io/gh/pandas-dev/pandas/compare/286b9b94d97fb2256d228a8970e92eee2ac3078a...e855e1ff9c5c505f9b50ff3e6f01b1da5f519522?src=pr)
 Looks good to me
 closed by https://github.com/pandas-dev/pandas/commit/7cad3f16bccd1d4702ef9d038b1ee0db33b9bb94
