better attribute validation

We only use results of getStringList to check if it contains certain keys.  Contains is O(n) on linked lists but (theoretically) O(1) on sets.  Costs a bit of memory, but definitely worth it here.