Agree in principal, but tricky: the DynamicGroup super-class calls addMember/removeMember based on its filter. If we overrode here to throw `UnsupportedOperationException` then it would break.

Options include:
1. override addMember and try to figure out (e.g. from stacktrace?!) if it's a legitimate call.
2. change DynamicGroup's calls to super.addMember, or have it call doAddMember - a bad idea as it'll break other use-cases where we really want to override the method's behaviour.
3. change ServiceReplacer so it doesn't `subscribeToMembers((Group)entity, ...)` so that `ControlledDynamicWebAppCluster` doesn't need to be a group. For example `MemberReplaceable` could have a `getGroup` method that would normally return `this` but could return child cluster for ControlledDynamicWebAppCluster.
4. ignore the problem!

I hedge towards 4.
Option 3 is appealing, but I worry it'll also be confusing.

Thoughts?