Refactor hidden fields logic

Rather than the route handlers having to know that req.fields exist and
passing it to the storage adapter, we instead expose the hidden fields
directly to the storage adapter, so the route handlers can just use the
Storage interface as normal.