Add retry logic for S3 connection errors when restoring snapshots

This commit adds a retry logic when reading blobs from S3. It also adds a retry logic when initializing a multipart upload and sets the internal "max retries" parameter of the Amazon S3 client with the same value as the "max_retry" parameter set for the snapshot repository (so in worst cases with the default value set to 3, 3x3=9 attempts will be made). The internal S3 client uses an exponential back off strategy between each connection exception (mainly IOException).

Closes elasticsearch/elasticsearch#8280
Add random read failures in unit tests to test the retry logic added to S3BlobContainer.openInput()