Async asset controller

Not yet ready for merging, but putting it out there for review. As it stands, I seem to have reduced throughput. More investigation is required because throughput should benefit from the changes.

I've made the assets controller a little more reactive, overhauling its implementation with the aspiration of making it easier to comprehend.

My main motivation for doing this is in anticipation of further working around digest handling. Digest handling will involve reading the contents of a file and so I wanted to ensure that etag handling (in particular) was performant.