use ImmutableSet/ImmutableList whenever applicable
some @noimplement for documentation purposes
Support multiple static constructors