Fix failover

@simplybusiness/developers @simplybusiness/systems 

This is our internal pull-request to fix moped failover so we can comment before we make pull-request to upstream repository.

It does couple of things:

* Refactoring: Moves with_retry method to Cluster -- it belongs there as it operates on cluster.
* Introduce retries on write operations -- it makes sense, because:
  * Update is idempotent
  * Delete is idempotent (deletes rows which are matching query)
  * Insert -- in worse case scenario we could end up with duplicated data, however given that moped is used by mongoid, which inserts rows always with _id already present, therefore such duplicated insert will raise unique index on _id violation, which is fine.
* Fixes failover mechanism -- Node#ensure_connected was written in a way that failover didn't take into account messages after executing operations ( processing of DB replies by callbacks was outside of begin-rescue block),  therefore failover mechanism was not exercised in most cases it was meant for.
* Removes ``` Reconfigure ``` failover mechanism -- it was raising exceptions not used anywhere else (and not retrying) -- it should be good enough to just retry.
* Refactoring: Move recognition mechanism for some errors from ``` Errors ``` class to ``` Reply ``` class, so errors recognition is in one place.
* Fixes refresh mechanism -- if node was successfully refreshed it isn't down any more.
* Reorganises Errors class and adds new types of errors
* Some other minor refactorings.


Outcome of those changes is that you can kill / restart mongo nodes in whatever order and as often as you like. You can even stop all replica-set nodes for couple of seconds (driven by ``` retry_count ``` and ``` retry_interval ```) and application will be able to recover without loosing any operations or throwing errors.
https://github.com/simplybusiness/moped/blob/master/lib/moped/node.rb#L129

And then here:
https://github.com/simplybusiness/moped/blob/master/lib/moped/cluster.rb#L339

and here:
https://github.com/simplybusiness/moped/blob/master/lib/moped/cluster.rb#L155

So basically after refresh node should not be marked as down anymore (if it really isn't down) otherwise https://github.com/simplybusiness/moped/blob/master/lib/moped/cluster.rb#L155 will exclude it from list of available nodes.