There are a lot of steps that use LogLineObserver - probably fewer using LogObserver.  My plan is to implement both of them as thin wrappers around events, which should be pretty straightforward.  LogObserver doesn't guarantee that it *won't* get line-terminated log entries, so connecting it with logs isn't a big deal.

It makes sense for steps to get logs as they happen because that's when the data is still hot - otherwise, we're writing a potentially huge stream of data to the DB, then needlessly rewinding and re-reading it to process in the step.