1. Tables are containers of other variables. These variables are called values. The values can be stored at certain keys. So the key identifies the value. In simple tables, the key is just the index (1,2,3,...).
They are indeed defined like this:
tbl = {'value1','otherValue','andAnotherOne'}
or with the keys explicitly:
tbl = {1='value1',2='otherValue',3='andAnotherOne'}
Then you can access them like this:
secondValue = tbl[2]
lastValue = tbl[3]
i=1
firstValue = tbl[i]
Now with custom keys it could be like this:
tbl = {'color'=colors.red(), 'name'='Me','age'=42}
name = tbl['name']
years = tbl.age
Notice the two ways of accessing a value at given key ([*] or .*).
At last, you can also change the keys and values after the declaration of the table:
tbl = {'name'='Me'}
tbl.hobby = 'programming'
tbl.oldName = tbl.name
tbl['name'] = 'Still Me'
So again, the [] notation is the same as the dot notation. Also, both keys and values can be anything, also other tables or functions.

/> (e.g., 'term' is in fact a table, and term['write'] or term.write is an entry in that table with key 'write' and a function as value)
2. tonumber(arg) and tostring(arg) are functions that take arg as an argument and change them to a number/string respectively.
For example:
str = "1"
num = tonumber(str)
sum = num + 1 -- works, 'num' is a number and 1 too, so you can add them
sum = str + 1 -- doesn't work, you're trying to add a string and a number :D/>/>
3. It is 'in pairs()'. (I just see that luanoob posted the answer, so I'll pass on this one

/> )