Handle empty and corrupted log parts.

We used to crash.  Now, sort them as "corrupted", and also use what we
can extract.

Corrupted files come from unsafe shutdowns.  It is impractical to be
perfect and never have any.

Change-Id: I68acc05d482c484f17ad335f4ab2054e180d8a37
diff --git a/aos/events/logging/logfile_utils.h b/aos/events/logging/logfile_utils.h
index 12d7cac..8381a9a 100644
--- a/aos/events/logging/logfile_utils.h
+++ b/aos/events/logging/logfile_utils.h
@@ -181,9 +181,10 @@
     flatbuffers::FlatBufferBuilder *fbb, const Context &context,
     int channel_index, LogType log_type);
 
-FlatbufferVector<LogFileHeader> ReadHeader(std::string_view filename);
-FlatbufferVector<MessageHeader> ReadNthMessage(std::string_view filename,
-                                               size_t n);
+std::optional<FlatbufferVector<LogFileHeader>> ReadHeader(
+    std::string_view filename);
+std::optional<FlatbufferVector<MessageHeader>> ReadNthMessage(
+    std::string_view filename, size_t n);
 
 // Class to read chunks out of a log file.
 class SpanReader {