Use interfaces for `SignedBeaconBlock` and `BeaconState`, this allows the application to determine the correct forked struct.
In the test we also use a switch condition to properly serve the correct mimics.
there is a main thread that tracks incoming messages, but then it spawns goroutines to actually process each slot so that they can happen concurrently.