This commit comprises a number of related changes:
(1) Reintroduces the semantic distinction between parseVarUsage vs parseVarBinding, adds documentation explaining the distinction, and adds commentary to the one place that violates the desired/intended semantics.
(2) Improves documentation/commentary about the forward-declaration of level-vars, and about the meaning of the bool parameter to parseLvlSpec.
(2) Removes the VarEnv::addVars method, and instead has DimLvlMapParser handle the conversion issues directly. In particular, the parser now stores and maintains the {dims,lvls}AndSymbols arrays, thereby avoiding the O(n^2) behavior of scanning through the entire VarEnv for each parse{Dim,Lvl}Spec call. Unfortunately there still remains another source of O(n^2) behavior, namely: the AsmParser::parseAffineExpr method will copy the DimLvlMapParser::{dims,lvls}AndSymbols arrays into AffineParser::dimsAndSymbols on each parse{Dim,Lvl}Spec call; but fixing that would require extensive changes to AffineParser itself.
Depends On D155532
Is the variable ever used after returning from parseVar?