Over at Math SE I've said a fair bit on the intrinsic circularity in mathematics, which explains how we can learn English and other things using English, despite circularity in semantics (e.g. you cannot define "if" without using some equivalent concept). This circularity does not prevent everyone from arriving at a precise common understanding of what certain basic constructions (e.g. "if X then Y") mean, which then allows us to bootstrap to define 100% precise formal systems using these basic English constructions.
On the other hand, I want to say that your belief that ambiguity in English is usually caused by context and meaning of words is a bit off. Natural languages have serious issues that cannot be solved by having precise meanings and contexts. For example take a look at this version of Quine's paradox:
" preceded by the quotation of itself is not a true sentence." preceded by the quotation of itself is not a true sentence.
which is a completely grammatical English sentence that appears to be a well-defined assertion Q that asserts something about X preceded by the quotation of X, where X is the string " preceded by the quotation of itself is not a true sentence.". Is Q a true sentence or not?
Think about it carefully. If you don't see a problem, or think that there is an easy resolution, then you're almost surely missing something big. Once you realize the difficult in resolving this paradox satisfactorily, see this Math SE post for one clean resolution (skip to the section "Why Quine's paradox fails" and ignore the rest).
The resolution also tells us that we must be careful in our assumptions about what is meaningful and what is true/false. That is why it is important not to carelessly assume we can just use the full English language for rigorous reasoning.
But as I said above, although natural language has some problems, we can still describe a formal system S to someone else by using only a small part of English. We can first describe the syntax and behaviour of simple programs (it suffices to have string variables, basic string operations, and if-structures and while-loops), and then describe S by writing down a proof verifier program for S, namely a program that given each input (p,x) would output "yes" if p is a valid proof of statement x in the system S, and would output "no" otherwise.
Your only 'hope' of arguing that this is not 100% precise is to argue that we may fail to come to a common understanding of the syntax and behaviour of simple programs. However, the fact that you are reading this post using a browser (which is a compiled program) shows that even complicated programming languages have successfully been described and understood.
It is true that most logic texts do not write down a proof verifier program for FOL, but every logician who knows programming can easily do so based on the description given in any good logic text, so 100% precision is still achievable.