Part
data class Part(val key: String, val fileNumber: Long, val partIndex: Int, val bytes: ByteArray?, val isFinal: Boolean)
Reassembles part metadata into a view of the upload state.
Usage: add the parts created by the factory.
PartBookkeeper.isComplete will be true when all the parts AND the final part have been seen, regardless of the order in which they were added.
Thread-safe: parts can be added by multiple threads in any order.