added binary encoding and decoding for multiple macaroons

Again, we can be a little better on the space here. Let's make a single copy of the slice at the start of this method, and use an internal unmarshal method that doesn't copy the data. Also, I suggest just slicing the data rather than using the start variable. That way you'll actually unmarshal the right data :) Oh, and it might help if we actually returned the unmarshaled macaroons...

Something like this, perhaps?

    func(ms *Macaroons) UnmarshalBinary(data []byte) error {
        // Make a single copy of the data, to be used by all the
        // macaroons.
        data = append([]byte(nil), data)
        *ms = (*ms)[:0]
        for len(data) > 0 {
            var m Macaroon
            err := mac.rawUnmarshalBinary(data)
            if err != nil {
                return fmt.Errorf("cannot unmarshal macaroon: %v", err)
            }
            *ms = append(*ms, &m)
            // Prevent the macaroon from overwriting the other ones
            // by setting the capacity of its data.
            mac.data = mac.data[0:len(mac.data):mac.binaryLen()]
            data = data[mac.binaryLen():]
        }
        return nil
    }

where rawUnmarshalBinary is just like UnmarshalBinary but doesn't copy
the data at the start. We'll need a test to make sure that adding caveats
doesn't mutate other caveats created from the same Macaroons slice.