1. Computers are dumb machines. They're not smart. When left to their own, they can't do anything meaningful.
2. All computer programming languages are confined by certain invariants imposed by the computer itself.
With that said, if you can look through the syntax of a language, you'll begin to see patterns in the design of the language.
Why do functions in Lua have to be closed off with end?
Because a computer doesn't know when it is suppose to stop execution.
Why do we need tables if we can just have unlimited number of variables?
Because tables provide a container for both current and future data.
Why does Lua pass in tables by reference? And why does {1,2,3} == {1,2,3} return false? What are the uses for metatables? And why in god's name is it so hard to understand Lua?
These can only answered through intellectual curiosity, because an answer in itself is an abstract notion without implementation, or an implementation without conceptualization. It's then crucial to start off from the beginning in order to learn how to use Lua. The beginning being recognition that computers are stupid, and that yelling at it to make you a sandwich will have absolutely no effects.
A gentle introduction to how programmers view computers: http://www.phailed.me/2011/02/computers/#desc