Made the overall logic more readable.

Split up the function accessing the dictionary and the function
handling errors. This way the first can be called by the second
and handle errors or the default value easily.

The new dictionary access function now uses a more straightforward
approach. This makes it more readable than the previous; And allows
the implementation of the new feature mentioned below.

The new feature is allowing of nesting indices and key access.
This way a key similar to "myoption.0.address" is legal to use.
Arbitrary nesting of these is supported.
@Wessie's reimplementation of kaptan.get
messed up with the merge