Backported HeartbeatInterceptor from master.

Uses AsyncIOInterceptor instead of AsyncIOInterceptorAdapter because the latter isn't available in atmosphere-1.0.x.