Stronghold client

This is the official client layer of Stronghold. It provides a Riker actor model system for easy Interface as well as functional passthrough to Stronghold's internal actor system for integrators not using Riker.

Stronghold Requests: - CreateVault: Creates a new vault which contains records. - InitRecord: Initializes a new Record in the specified Vault. - ListIds: Returns the RecordIds and RecordHints from the records contained in the specified Vault - WriteSnapshot: Writes a snapshot with a given password, filename and path. If no path is given, the path will default to the $HOME/.engine/snapshot folder. The name of the snapshot defaults to backup.snapshot. - ReadSnapshot: Reads the snapshot with a given password, filename and path. If no path is given, the path will default to the $HOME/.engine/snapshot folder. The name of the snapshot defaults to backup.snapshot. - WriteData: Writes data into the record in the specified Vault. If a RecordId is not specified, it will write to the head of the vault. This action must be called after CreateVault or InitRecord must be called first or else this command will replace the data in the record. - ReadData - Reads data from the record of the specified Vault. If a RecordId is not specified, it will write to the head of the vault.
- RevokeData - Marks a record for a deletion based on the specified vault. - GarbageCollect - Cleans up any marked deletions and removes them from the the given vault.

Stronghold Responses: - ReturnCreate: Returns the new VaultId and first RecordId from the CreateVault message. - ReturnInit: Returns the VaultId and the RecordId for the Record that was created using InitRecord. - ReturnRead: Returns the payload as a Vec<u8> of utf8 bytes as a result of the ReadData message. - ReturnList: Returns a Vec<(RecordId, RecordHint)> containing all of the RecordIds and RecordHints from the message ListIds. - ReturnRebuild Returns the results of ReadSnapshot, a Vec<VaultId> containing newly generated VaultIds and a Vec<Vec<RecordId>> containing all of the records for each vault in order.

To call the APIs, currently you must call init_stronghold() which will return a tuple of the Riker ActorSystem and a ChannelRef of type SHResults. The ActorSystem is used to attach any external actors and the ChannelRef is used to collect the outgoing messages from stronghold.

TODOS: - Synchronization via 4th actor and status type. - Add supervisors - Add documentation - Encrypted Return Channel - Build a Handshake Process - Create O(1) comparison for all IDS. - Remove #[allow(dead_code)]s tags. - Add more test coverage - Add a method of attaching metadata (RecordHints) - ~~Add ability to name snapshots~~ - ~~Add ability to read and revoke records not on the head of the chain.~~ - ~~Add Reference types for the RecordIds and VaultIds to expose to the External programs.~~