Rewrite `action` decorator to support multiple methods; add low-level `route` decorator