Rationale: in practice, a ProofId was always a slot id, and
an EndId was always a request id. Now that the definitons
of SlotId and RequestId are separated from the Marketplace,
we can import and use them.
1. Remove proof extension as it is not needed. Host are required to provide proofs from the moment they fill a slot, for the duration specified by the contract. This means that the ending of their requirements will be staggered at the end, as they were at the start, but this is more predicable for determining the cost of a request.
2. The proof end time was modified so that if the request state is not accepting proofs, it takes the min of the slot proof end time, the request end time, or block.timestamp - 1, which ensures that it returns a time in the past. If the slot is accepting proofs, it returns the slot end time.
3. Modify marketplace tests so that `waitUntilFinished` advances time to the proof ending of the last slot filled.
Allow proof ending to be extending once a contract is started, so that all filled slots share an ending time that is equal to the contract end time. Added tests.
Add a mapping for proof id to endId so that proof expectations can be extended for all proofs that share a given endId.
Add function modifiers that require the request state to allow proofs, with accompanying tests.
General clean up of each function’s request state context, with accompanying tests.
General clean up of all tests, including state change “wait” functions and normalising the time advancement functions.
Add function `isFinished` that checks whethere the state has been set to `RequestState.Finished` (which is not being set yet) or if the contract was started (`RequestState.Started`) and the contract duration has lapsed.
To facilitate `isFinished`, the contract start time (`startedAt`) was added to calculate the contract end time.
The block hash of the current block is not known yet, so
we use the block hash of the previous block to determine
whether a proof is required for a block.