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
What about this?

We define the following trait to describe an object able to serialize and deserialize abstract transactions.

```
trait TransactionSerialization[T] {
  def serialize(tx: T): Array[Byte]
  def deserialize(bytes: Array[Byte]): T
}
```

We might have of course an implementation for our `ImmutableTransaction` class.

```
object ImmutableTransactionSerialization extends TransactionSerialization[ImmutableTransaction] {

  override def serialize(tx: ImmutableTransaction): Array[Byte] = ???

  override def deserialize(bytes: Array[Byte]): ImmutableTransaction = ???
}
```

Then, `Exchange` is able to return a `TransactionSerialization` object for its abstract `Transaction` type. 

```
trait Exchange[C <: FiatCurrency] {
  type KeyPair
  type TransactionOutput
  type Address
  type Transaction
  type TransactionSignature

  def transactionSerialization: TransactionSerialization[Transaction]
```

Finally, we might use the serialization object from anywhere we have a exchange object.

```
  val exchange: Exchange[Currency.Euro.type] = null
  val serialization = exchange.transactionSerialization
```

Thoughts?