As I see it, the script feature is one of the most complicated features in the entire protocol. It features
$ cat src/script.h|grep '^ *OP_'|wc -l
118
instructions, and requires a stack to calculate.
The most important limitation, it makes it complicated to answer a simple and common question - "how much bitcoins does my key have".
With a complicated script, a bug in the script engine is more likely, and thus, it is possible that the network will split (50% client accept this transaction, 50% do not, before you notice, you have two long block chains. One longer which is considered invalid by 50% of the clients, and one shorter, considered valid by both).
What's the rational behind such a system? Why can't any transaction be simply "move X BTC from key K to key I signed by private key K"?
(If indeed you want anything complex - do that in a different system, and not inside bitcoins block).