Why:
* For the realtime fetcher to keep up on ETH we want it to fetch blocks
asynchronously. We noticed that the realtime fetcher was falling behind
on ETH mainnet. Currently the realtime fetcher fetches and imports one
block at a time. This commit changes that, so that whenever we're
notified of a new block number, through websockets, we start a new
process to fetch and import each block asynchronously.
* Also, whenever the websocket subscription, through which we're notified
of new block numbers, skips block numbers, we want to make sure the
skipped blocks are also fetched and imported.
* Issue link: n/a
This change addresses the need by:
* Adding a new `Task.Supervisor` called
`Indexer.Block.Realtime.TaskSupervisor` under the
`Indexer.Block.Realtime.Supervisor` supervisor. This supervisor was
created to supervise fetching and importing processes started by the
realtime fetcher every time a new block number is received through the
websocket subscription.
* Editing `Indexer.Block.Realtime.Fetcher` to start a new process, under
the new supervisor mentioned above, to fetch the latest block per the
websocket `newHeads` subscription. It also determines if any block
numbers have been skipped and starts individual processes to fetch and
import the skipped blocks also.