We created a custom implementation of an io.ReadCloser that allowed us to wrap the http.Handler's io.ReadCloser and attach context to the request:
https://github.com/bradrydzewski/routes/blob/master/exp/cont...
It avoids the global lock and we haven't found any compatibility issues.