Get back to lint clean
Allow integration by other fiber-sync implementations

Move the magic sync-and-pump code from #wait into Trampoline.yield.  This allows
anyone else doing fiber-sync code to use Trampoline.yield instead of Fiber.yield
in their implementation to allow promises to keep resolving while they wait.
Not ready once Fiber has started either
Defer through a Fiber trampoline

Instead of running all defer blocks on the EM reactor fiber, run in a dedicated
Fiber trampoline.  Inherit the trampoline from scope if present, or from the
promise you call #then on, or else make a new trampoline.  This means that all
callbacks on promises in a logical chain run in the same Fiber as each other,
but a different one from all other code, so Fiber-local variables are scoped to
the logical chain, like so:

    EMPromise.resolve(nil).then {
    	Thread.current[:fiber_local] = 123
    }.then {
    	p Thread.current[:fiber_local] # 123

This also allows us to mix promise-based and fiber-based code arbitrarily,
without any extra special helpers, including #sync itself, for example:

    EMPromise.resolve(nil).then {
Support #sync on Defferable
eventmachine is a dependency
Allow users to catch only some errors

This implements the common pattern:

promise.catch do |e|
	if SomeError === e
		# handle

It also allows for this usage for more granular catching:

promise.catch_only(filter: ->(e) { e == :done }) do
	"all done"