Extract LogicalLogRecord class

LogicalLogRecord describes the logical log record, and is
responsible (along with a provided StackTraceProcessor) for
formatting the logical record into a physical record.
Change the cause to be an Optional<Throwable>
Add unit tests for LogicalLogRecord
Timestamps should include milliseconds on a whole second

Use a custom DateTimeFormatter to override the default
behaviour, which will use zero, three, six, or nine decimal
places depending on the nanosecond count. In practice, this
means that an instance will have zero decimal places if it is
exactly on an even second.

Always providing milliseconds keeps the output lined up.