fix(sync): don't lose nodes on single download err

`P2pCandidate.dlPromise` promise doesn't resolve on download errors
such as socket timeouts. Each time such an error occurs, the node is lost
for the sync because the 'this.dlPromise.isResolved()' check used for
testing the node's availability never succeeds anymore for this node.

This patch hardens the blocks downloading in two ways:
* Retrying the download up to 5 times when the number of returned blocks is
  different from what was requested
* On failure returns an empty block array so that the dlPromise is resolved
  and the node failure could be handled as expected at the P2PSyncDownloader
  level triggering the `P2pCandidate.addFailure()` function.
7 jobs for !1389 with pini in 22 minutes and 33 seconds (queued for 8 seconds)
detached
Status Job ID Name Coverage
  Tests
passed #53832
redshift
tests

00:17:23

69.35%
 
  Package
manual #53835
redshift allowed to fail manual
package:test:docker-test-image
manual #53834
redshift allowed to fail manual
releases:test
 
  Quality
passed #53837
redshift
audit_dependencies

00:01:36

passed #53836
redshift
fmt_and_clippy

00:05:09

 
  Integration
manual #53838
redshift allowed to fail manual
sync_g1
manual #53839
redshift allowed to fail manual
sync_gtest