Workspace
Reusable scratch buffers, pooled by width. Every borrow outstanding at the same time gets a different buffer, so nesting is safe. Not thread-safe, deliberately: sharing one across threads corrupts results.
A borrow is always exactly the width asked for, so a caller whose sizes vary opens a pool per width. Pools sit in most-recently-used order, and past 64 of them the coldest idle pool is dropped to bound what one workspace holds. A pool with a buffer still lent out is never dropped.
take lends double-precision buffers, the element type an unqualified borrow means. An element type added later gets a borrow and a return of its own over the same ArrayPools, and its buffers are pooled apart from these: a pool lends one array type, so the 64 widths are counted per element type.