Ensures that incompatible roles are removed from cluster info on availability events


Given that when an instance fails it does not broadcast unavailability events, it may
 happen that an instance failing and rejoining can keep the backup role. Also, an
 instance failing should have its roles removed, as they are no longer relevant. This
 commit does so by checking in ClusterMember for incompatible roles and removing them.
 Additionally, it removes all roles from an instance when a failure event is received
 for it.
Adds tests for these conditions on the ClusterMembers level.
Why not just reassign the local variable with the result of `unavailableAs()`? Like this:

    ClusterMember member = getMember( instanceId );
    for ( String role : member.getRoles() )
    {
        member = member.unavailableAs( role );
    }
    members.put( instanceId, member );