* Add pumactl command to print thread backtraces
Completes 1 of 2 items from #1964
This commit adds an endpoint to the status app to print thread
backtraces, and control cli command to call that endpoint.
I tried this locally by starting a server with:
```sh
bundle exec bin/puma test/rackup/hello.ru \
--control-url="unix://test.sock" \
--control-token="token"
```
and then printing the backtraces with:
```sh
bundle exec bin/pumactl thread-backtraces \
--control-url="unix://test.sock" \
--control-token="token"
```
* Log threads as JSON in control app
With this commit the status app sends the thread backtraces as an array
of objects with `name` and `backtrace` keys, rather than as a string
matching the SIGINFO output.
While working on this I noticed that we logged the thread TID twice.
This commit simplifies that so we only log the thread TID once, with
both the label (I don't know when the label would get set) and name if
they are available.
* Allow extra runtime deps to be defined when using prune_bundler
* Check extra_runtime_dependencies is set before iterating over them
* Load additional paths for extra runtime dep gems
* Don't load extra dependencies, just add their paths to $LOAD_PATH
* Fix typos and extraneous checks and rescues
* Use Gem::Specification#full_require_paths when available
* Prevent use of prune_bundler and extra_runtime_dependencies with early versions of RubyGems
* Ensure LOAD_PATH is modified by extra_runtime_dependencies
* Refactor prune_bundler in launcher.rb and write some unit tests