[2.2] Batch writer thread empties buffer into channel

instead of each append call, which allows for less calls to
FileChannel#write and less I/O wait for append threads.

At least there's a very noticable difference on Windows,
not as much on linux unless in scenarios with high thread count.
Looking at it as a unit, you are right. However looking at where it is used the synchronization holds, except for `close()`, `PhysicalLogFile#shutdown()` is missing a synchronized, you're right. Otherwise:

- `#bufferWithGuaranteedSpace` <-- `PhysicalWritableLogChannel#put???` <-- `AbstractPhysicalTransactionAppender#append0` <-- `AbstractPhysicalTransactionAppender#append` <-- `synchronized(logFile)`
- `AbstractPhysicalTransactionAppender#emptyBufferIntoChannel` <-- `AbstractPhysicalTransactionAppender#append0` <-- `AbstractPhysicalTransactionAppender#append` <-- `synchronized(logFile)`
- `AbstractPhysicalTransactionAppender#force` <-- `synchronized(logFile)`

I'll add `synchronized` to `PhysicalLogFile#shutdown`