Refinement Types: A Tutorial (Foundations and Trends(r) in Programming Languages)