Restrucure error reporting to differentiate the cause and source of an error

Restrucure error reporting to differentiate the cause and source of an error. E.g. introduce separate error structs: EmbeddedRedisClientError and EmbeddedRedisServerError.