message: Fix race condition in multithreaded deserialization.
  unordered_map iterators are not thread save since operations on one
  thread can invalidate iterators on another.  So instead we use a
  direct pointer to the internal data from the map.
diff: @@ -810,35 +810,37 @@ std::unordered_map<std::string, std::vector<BP3Base::SerialElementIndex>>
  BP3Serializer::DeserializeIndicesPerRankThreads(
  const std::vector<char> &serialized) const noexcept
  {
  - auto lf_Deserialize =
  - [&](const int rankSource, const std::vector<char> &serialized,
  - const size_t serializedPosition,
  std::unordered_map<std::string, std::vector<SerialElementIndex>>
  - &deserialized) {
  + deserialized;
  +
  + auto lf_Deserialize = [&](const int rankSource,
  + const size_t serializedPosition) {
  size_t localPosition = serializedPosition;
  ElementIndexHeader header =
  ReadElementIndexHeader(serialized, localPosition);
  + std::vector<BP3Base::SerialElementIndex> *deserializedIndexes;
  // mutex portion
  {
  std::lock_guard<std::mutex> lock(m_Mutex);
  - if (deserialized.count(header.Name) == 0)
  - {
  - deserialized[header.Name] = std::vector<SerialElementIndex>(
  - m_SizeMPI, SerialElementIndex(header.MemberID, 0));
  - }
  + deserializedIndexes =
  + &(deserialized
  + .emplace(std::piecewise_construct,
  + std::forward_as_tuple(header.Name),
  + std::forward_as_tuple(
  + m_SizeMPI,
  + SerialElementIndex(header.MemberID, 0)))
  + .first->second);
  }
  const size_t bufferSize = static_cast<size_t>(header.Length) + 4;
  - SerialElementIndex &index = deserialized[header.Name][rankSource];
  + SerialElementIndex &index = deserializedIndexes->at(rankSource);
  InsertToBuffer(index.Buffer, &serialized[serializedPosition],
  bufferSize);
  };
  // BODY OF FUNCTION starts here
  - std::unordered_map<std::string, std::vector<SerialElementIndex>>
  - deserialized;
  const size_t serializedSize = serialized.size();
  if (m_RankMPI != 0 || serializedSize < 8)
  @@ -857,8 +859,7 @@ BP3Serializer::DeserializeIndicesPerRankThreads(
  if (serializedPosition <= serializedSize)
  {
  - lf_Deserialize(rankSource, serialized, serializedPosition,
  - deserialized);
  + lf_Deserialize(rankSource, serializedPosition);
  }
  const size_t bufferSize = static_cast<size_t>(
  @@ -901,10 +902,8 @@ BP3Serializer::DeserializeIndicesPerRankThreads(
  if (serializedPosition <= serializedSize)
  {
  - asyncs[t] =
  - std::async(std::launch::async, lf_Deserialize,
  - asyncRankSources[t], std::ref(serialized),
  - asyncPositions[t], std::ref(deserialized));
  + asyncs[t] = std::async(std::launch::async, lf_Deserialize,
  + asyncRankSources[t], asyncPositions[t]);
  }
  }
  