Refinement kinds - type-safe programming with practical type-level computation