UM fields array structure identification for fast loading.

Context: 
The key external interface is "group_structured_fields"  (in iris.fileformats.um._fast_load_structured_fields).
 * this returns 'FieldCollation'-s ..
 * .. which are in effect triples of (vector_dims, dimension_elements, element_arrays_and_dims)
 * .. so something else can turn that information into cubes.

There is no actual user API yet. 
Most probably will be an experimental 'iris.load'-like function, which will take filenames + return cubes.
Difficult this 'best' arrangement chosen as I'm unsure as to why something qualifies for being more optimal.  I can appreciate that we would want to maximise the number of dimensions (of length greater than 1).

> np.prod([struct.size + for (name, struct) in potential]),

It has taken me quite a while to get my head around what this actually achieves since it relies on an understanding that given an array a, b, c, d.  The possible structure returned might be a, c, d and then b is not mapped across multiple dimensions or a, b, c, d etc.  This way, maximising the product ensures that we are maximising the size of our multidimensional array.

> len(potential)

Second in priority due to it being second, is the number of the supplied arrays being mapped across the multidimensional result.

> max(element_priorities[name] for (name, struct) in potential)

Third in priority is a preference for structures which contain certain names over others (I believe this is prioritisation assignment was by order).

I think we definitely need to extend the documentation and put some comments above these lines.