We request chunks concurrently. This makes header-sync much faster
when we are many blocks behind.
notes:
- all chunks are downloaded from the same interface, just for simplicity
- we request up to 10 chunks concurrently (so 10*2016 headers)
- more chunks: higher memory requirements
- more chunks: higher concurrency => syncing needs fewer network round-trips
- if a chunk does not connect, bandwidth for all later chunks is wasted
- we can tweak the constant or make it dynamic or make it a configvar, etc, later
- without this, we progress the chain tip by around 1 chunk per second
- 52k blocks (1 year on mainnet) takes around 26 seconds
- this is probably not *that* interesting for mainnet,
but for testnet3, that sometimes has 200x the block-rate of mainnet,
it is extremely useful