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
```
