Zap currently uses an internal package to house its buffer pool, and it returns all buffers to that pool. This is problematic for two reasons: 1. First, third-party encoders can easily corrupt the pool by keeping a reference to a buffer. 2. Second, third-party encoders can't pool their buffers, since zap needs to know how to return them to their pools. This PR introduces a `buffer.Pool` type to solve this problem. Individual buffers can only be created via a pool, and each buffer keeps a reference to its pool of origin. This allows zap to continue using a single internal pool, but it allows third-party encoders to safely pool their buffers too.