Set registers via :let

This has a number of interesting uses, such as `let @+=@%`, which copies
the currently filename to the system clipboard rather succinctly.
Notably, the display version of let does not work with register names
(e.g.  `let @+ @%`).
Updated error messages per pull request discussion

Refactored some in the process. I realized that there were a number of
situations in which Vim will give "Using List as a string" or the like
as an error, including `:echo 'asdf' . []` and `:let @a=[]`, and so
decided to introduce a structure that supported that, because I was
noticing a pattern of having to convert numbers to strings for several
commands. This should also happen, strictly, in function calls, but
exists(1) (which returns 0) hardly seems valuable to me.
Implemented `:echo []` and `:echo {}`

I was trying to test the errors I put in in the last commit and couldn't
get them to come up, so I went ahead and improved the list and
dictionary support every so slightly so I could finish the testing.
Besides, it's probably something we would have wanted to do eventually
anyway.
Updated error message that I forgot in last commit

Because I went too hog-wild on what I was doing...
Merge pull request #1513 from Kazark/fix-let-register

Set registers via :let