Refactor executors

Some of our executors date back to the earliest days of this gem (such as `PerThreadExecutor`, formerly `NullThreadPool`). As a group they have evolved significantly over the course of many pull requests. While [refactoring Async](https://github.com/ruby-concurrency/concurrent-ruby/commit/846ff1037fca0013980ce8ef3f2a0dc277296ab9) I noticed several opportunities to refactor specs and to bring some of the older classes into better alignment with our current practices. This PR consolidates those updates. It also includes better documentation.