avoid using Message.getFields() if possible

 getFields returns a copy of the fields map, which is expensive if done in a loop or multiple times
 use delegate methods instead, if we don't actually need the entire map (e.g. checking if a field is set or getting the count)