Make (++) right associative

Since (++) recurses on its left argument, (l ++ c) ++ r traverses l twice,
while l ++ (c ++ r) only once.

Furthermore, making (++) the same precedence as (::) enables the two to be
mixed.
Remove conflicting fixity declaration
Fix some load instructions being incorrectly marked as invariant for LLVM

This resolves some possible cases of undefined behavior.
Add mapVE for mapping over Vects in Eff

mapE existed for lists, but vectors were feeling left out.
Add index and index' to List.
Flatten tuples to right in pretty printer

* Tuples are flattened to the right, just as the parser nests them to
  the right

* Almost-duplicate printing code for tuples and pair types is greatly
  simplified.

Fixes #881.
Improve pretty-printing of function applications

* Show infix operators properly even if they have a number of arguments
  that isn't 2
   * snd . snd $ (1,2,3) is now (snd . snd) (1,2,3) instead of
     . snd snd (1,2,3)
   * (+) 4 is shown as (+) 4

* Show applications where all arguments are implicit without parens
  around them

Fixes #882.
Use the pretty-printer to show :doc

This has the benefit of colors in both console and IDESlave mode.
More reliably find argument names in :doc
More accurately find argument types in :doc
Add some indentation to functions in :doc

This vastly improves the readability of :doc for typeclasses
javascript: revive EVAL optimization during codegen
javascript: revive APPLY optimization
javascript: compile if conditions with noop
javascript: move constructor decl up after optimization
javascript: fix optimized eval and apply calls
javascript: fix eliminateDeadbranches for conditions
javascript: adapt apply on table unfold
javascript: adapt eval on table unfold
javascript: adapt applytc on table unfold