Refine and test exchange model

**Description:** refine and test the exchange model up to the handshake part. Closer to a complete implementation but we should stop and merge at some point so stuff marked as TODO and MicroPaymentChannel stuff is out of scope.
**Testing:** tests pass!
**Coverage:** about 80% for the `impl` package.
**Reviewer:** @ximo
Shouldn't preconditions go inside the function to which they apply? I would expect the `ensureValidRefundTransaction` call to be inside `signRefundTransaction`, since it is a precondition to be able to sign a refund transaction. If we don't do that, then a future edit of the file might add a call to `signRefundTransaction` with an invalid refund transaction.