Recovery: cleaner interrupt handling during cancellation

RecoveryTarget initiates the recovery by sending a start recovery request to the source node and then waits for the recovery to complete. During recovery cancellation, we interrupt the thread so it will wake up and clean the recovery. Depending on timing, this can leave an unneeded interrupted thread status causing future IO commands to fail unneeded.

RecoverySource already had a handy utility called CancelableThreads. This extracts it to a top level class, and uses it in RecoveryTarget as well.

This caused the failure in http://build-us-00.elasticsearch.org/job/es_core_master_strong/1755/
Using a one-element array as a fake `AtomicReference` makes me suuuuper nervous, is there any reason to do this? Is it because we're not actually passing a thread barrier here? Can we use an `AtomicReferenc` instead? Or better yet, just set the var and assert it's been set after `run()` is executed?