@farcaller: I don't understand how to reference bit-aligned data. Also, how would you create and transmute bitstrings?

I'm convinced bit matching should use structs.
```rust
struct Dgram {
  ip_vers: Uint<4>,
  hlen: Uint<4>,
  srvc_type: u8,
  total_len: u16,
  id: u16,
  flgs: Uint<3>,
  frag_off: Uint<13>,
  ttl: u8,
  proto: u8,
  hdr_chksum: u16,
  src_ip: u32,
  dest_ip: u32,
}

static IP_VERSION = 4;
static IP_MIN_HDR_LEN = 5;

let size = size_of::<Dgram>();
match dgram {
  Dgram {
    ip_vers: IP_VERSION,
    hlen: hlen,
    srvc_type: srvc_type, total_len: total_len,
    id: id, flgs: flgs, frag_off: frag_off,
    ttl: ttl, proto: proto, hdr_chksum: hdr_chksum,
    src_ip: src_ip, dest_ip: dest_ip,
  } if hlen >= 5 && hlen*4 <= size {
    let opts_len = 4 * (hlen - IP_MIN_HDR_LEN);
    let (opts, data) = rest.split_at(opts_len);
    // ...
  },
  _ => (),
}
```