Use lock free strategy

Reduce contention by using CAS (Compare And Swap) operations to replace
subscription
Make unsubscribe + reference modification an atomic operation
Lock free strategy using a sentinel (Thanks to akarnokd)
Code simplification
Simplify code; Junits
fix: getSubscription should not expose internal sentinel subscription
JUnit setting subscription concurrently
Return null on getSubscription() when previously unsubscribed to match
initial contract
use non-locking state machine based on atomic reference
Merge pull request #568 from jloisel/master

Use lock free strategy for several Subscription implementations