Rework the node insertion code in dht_state.

The code was very convoluted. I initially believed the code to have two code paths,

* One for the case where the node was already a member
* One for when the node was genuinely new

The code then follows the same path, but splits into two paths based on case analysis.
My initial idea was to split this into two separate paths, but it turns out there is only
one path. The first of the above mentioned paths doesn't exist.

When you insert a new node, you should always update its node timer. And you should
always check the bucket timers as well. This is better hoisted out in a function `rt_add/3`
for itself which does the maintenance. This function itself could use some further refactoring,
but this is a start.
Simplify the code path for handle_info/2

The change is to use a more directly encoded style where simple case
analysis statements figures out what to do. There are still some work to be
done w.r.t cleanup, but this is a start at least.
Guard storage of dumping state to disk.
Split up the very big `rt_add` function.

We now thread the State object through and manipulate it in layered fashion.
While here, split a monster function into smaller screenful-understandable chunks.
Strenghten type specifications in the state code.

My hope is this will catch bugs later on. It enforces the type structure of the state system,
which is needed.