Add TypedAttrName<T> for better DSL.

What about doing it this way?

`restrict(suppliers(), NAME.asStr(), name -> name.contains('a'));`
`restrict(suppliers(), STATUS.as(Integer.class), status -> status == 30);`

I really don't want us to make AttrName a generic at this stage. It just propagates everywhere.