keepalive closing must be deferred to fix race when finish callback is still alive,
but keepalive context has been closed, keepalive goroutine has awakened,
set callback pointer to NIL, GC has fired and freed this memory
...
and then the rest of the final callback has been executed.
there may exist some golang internal stuff even though close(keepaliver)
is the last operation in the function