WIP: MarshalBinary

Taking inspiration from @bjeanes' Playground code here: http://play.golang.org/p/uFj1mdBKG6.

What this is attempting to do is build a binary representation from a message (i.e. the opposite of the `Decode` function), in preparation for sending it back down the pipe and out to the world.

I still have no idea what I'm doing here, but this *feels* like the right track.
I played a bit with it too. It seems to always give 40 for structs and I think it's because there are a few caveats:

* it is returning the size in memory, not the size it would be upon encoding. So it might be encoding some extra type information or pointer addresses, who knows... Go could also be aligning struct fields on memory word boundaries so padding some short fields out to a longer in memory size. I don't know if Go is doing this, but C will sometimes.
* it doesn't encode the size of data in slices, just the slice "header" information (length, capacity, type, etc)

Furthermore `m.Payload` is essentially an `interface{}` type, which behind the scenes is a couple of pointers. It looks like `unsafe.Sizeof` is always returning `16` there, though there is probably a way to get at the root value (`reflect` package maybe?).

So, instead I think we should do something like this:

``` go
// probably in header.go
const HEADER_SIZE = 36

// some error handling etc ommitted
func (m *message) MarshalBinary() (data []byte, err error) {
	buf := bytes.NewBuffer([]byte{})
	binary.Write(buf, binary.LittleEndian, m.Payload)
	payloadBytes := buf.Bytes()

	raw := m.Header.ToRawHeader()
	raw.Size = HEADER_SIZE + len(payloadBytes)
	raw.Type = m.Payload.Id()
	buf = bytes.NewBuffer([]byte{}) // new buffer
	binary.Write(buf, binary.LittleEndian, raw)

	return append(buf.Bytes(), payloadBytes...), nil // obv actually with the error handling heh
}
```

Totally untested and just typed up in this comment, but something like that might work. Assuming `binary.Write` doesn't give a headache with writing out the interface type.