Split EventDetail into atomic sub-parts

There is one layer of user-facing structures that contain consistent types, and another layer that only contain atomic Scala types, useful to perform 'save' operations on Spark.