Add lightweight grib message wrapper

Provides a lightweight wrapper to a GRIB message. This, along with #1300, provide some early elements in the process of improving Iris' GRIB loading capacity.

Note that this new GRIB loader loads only the **coded** keys from a GRIB message, not any of the computed keys. However the gribapi function, `gribapi.grib_skip_computed()`, which should return only the coded keys from the message, has a bug in gribapi < 1.13 so to prove the concept of this GRIB wrapper it has been designed to work with a single message from a specific GRIB file. However once the the new version of gribapi is available the code below should function as expected (i.e. returning only the coded keys from the message).
@dkillick There's an extra couple of special cases that we need account for here i.e.
```
elif key in ['typeOfFirstFixedSurface', 'typeOfSecondFixedSurface']:
    res = gribapi.grib_get_long(self._message_id, key)
```

Unfortunately, this is due to the schizophrenic nature of the `gribapi` which appears to be able to return either a `string` or `numeric` representations of certain coded keys :scream:  

As it happens, we need `typeOfFirstFixedSurface` and `typeOfSecondFixedSurface` to be numeric rather than defaulting to `string`. So could you explicitly cast the type using `grib_get_long`. Thanks.