message: {
  messageID: {
    ciphertext: string,
    plaintext: string,
    contact: string key,
    group: string key,
    timestamp: int,
 },
}

groups: {
  "name" : {
    id: base64 encoded nonce,
    contact_ids: ['nameA', 'nameB', …],
 },
}

contacts: {
  "name": {
    public: base64-arraybuffer (pubkey),
    devices: [
      {
        registration_id: int,
        session: {
          states: {
            new Number(): {
              localIdentityKey: base64-arraybuffer,
              localRegistrationId: new Number(),
              recievingChains: [
                new Number(): {
                  chain: {
                    index: new Number(),
                    key: base64-arraybuffer,
                    messageKeys: [
                      //currently zero length need to figure out when this is populated
                    ],
                    theirEphemeralKey: base64-arraybuffer,
                  },
                  theirEphemeralKey: base64-arraybuffer,
                }
              ],
              remoteIdentityKey: base64-arraybuffer,
              rootKey: base64-arraybuffer,
              senderRatchetKeyPair: { keypair },
              sendingChain: {
                index: new Number(),
                key: base64-arraybuffer,
                messageKeys: [
                  //currently zero length need to figure out when this is populated
                ],
              },
              sessionVersion: 3, //yes, this is currently hardcoded
              theirBaseKey: null, //currently null need to figure out when this is populated
            }
          }
        }
      }
      ...
    ],
  }
}