Add support for optional fields

An optional type will only encode/decode when given condition is truthy:

```coffeescript
Record = new r.Struct(
  name: new r.String()
  flags: r.uint32
  age: new r.Optional(r.uint8, -> @flags & 0x50)
  friends: new r.Array(..)
)
```

Unsure about the amount of duplicated code, especially in the specs. Thoughts?