Make sure root is always initialized

This reorganizes the initialization a bit and makes sure, that root node
is initialized even by the default constructor.

Signed-off-by: Robert Varga <robert.varga@pantheon.sk>
Rework the read-only handling

Instead of using the updater reference as the indicator of read-only
views, add an explicit boolean. Thus all instances reuse a single
updater reference, but still guard access to it via an explicit check.

This changes the behavior a bit: instead of throwing NPE on read-only
views, we throw IllegalStateException. The reason for that is that we
should have caught the attempt in the MAP API functions.

Signed-off-by: Robert Varga <robert.varga@pantheon.sk>
Detect attempts to modify read-only view

Adds explicit checks for read-only snapshot before attempting to perform
a modification operation. As per ConcurrentMap/Iterator interface
specification, throw an UnsupportedOperationException if such an attempt
is made.

Signed-off-by: Robert Varga <robert.varga@pantheon.sk>