Re-worked the set/add/remove functions to be more stable, faster.
Contains is now "result non-negative" rather than "non-zero"