Previously, build_resources could only be used as a context manager. This opens up build_resources to be used as a fxn as well, since most resources actually are not context managers.
Unfortunately, the implementation is a bit funky, as support for using something as both context manager and function in python has drawbacks. The gist is that to get context manager functionality, the returned object needs to be a context manager that can vend the required thing, and to be a function, the returned object basically needs to be the required thing. So I used the __getattr__ trick to vend attribute calls to the underlying constructed resources.